home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / has060 / hassrc87.lzh / pseudo.s < prev    next >
Text File  |  1999-10-08  |  54KB  |  2,302 lines

  1. ;----------------------------------------------------------------
  2. ;    X68k High-speed Assembler
  3. ;        疑似命令のアセンブル処理
  4. ;        < pseudo.s >
  5. ;
  6. ;    $Id: pseudo.s,v 1.21  1999 10/ 8(Fri) 21:00:37 M.Kamada Exp $
  7. ;
  8. ;        Copyright 1990-94  by Y.Nakamura
  9. ;              1996-99  by M.Kamada
  10. ;----------------------------------------------------------------
  11.  
  12.     .include    has.equ
  13.     .include    DOSCALL.MAC
  14.     .include    cputype.equ
  15.     .include    register.equ
  16.     .include    tmpcode.equ
  17.     .include    symbol.equ
  18.  
  19.     .cpu    68000
  20.     .text
  21.  
  22.  
  23. ;----------------------------------------------------------------
  24. ;    疑似命令のアセンブル処理
  25. ;----------------------------------------------------------------
  26. dopseudo::
  27.     movea.l    (LINEPTR,a6),a0
  28.     move.l    (SYM_FUNC,a1),a2
  29.     jmp    (a2)            ;処理ルーチンへジャンプ
  30.  
  31. ;----------------------------------------------------------------
  32. ;    オペランドの値を計算する
  33. calcopr:
  34.     lea.l    (OPRBUF,a6),a0
  35.     lea.l    (RPNBUF,a6),a1
  36.     bsr    convrpn
  37.     tst.w    d0
  38.     bmi    exprerr            ;式変換に失敗
  39.     bra    calcrpn
  40.  
  41. ;----------------------------------------------------------------
  42. ;    オペランドの値を計算する(定数でなければエラー)
  43. calcconst::
  44.     bsr    encodeopr
  45.     bsr    calcopr
  46.     tst.w    d0
  47.     bne    iloprerr        ;<式>が定数でない
  48.     rts
  49.  
  50. ;----------------------------------------------------------------
  51. ;    ifの条件式の値を得る
  52. ifcond:
  53.     bsr    encodeopr
  54.     lea.l    (OPRBUF,a6),a0
  55.     lea.l    (RPNBUF,a6),a1
  56.     bsr    convrpn
  57.     tst.w    d0
  58.     bmi    exprerr            ;式変換に失敗
  59.     bsr    calcrpn
  60.     tst.w    d0
  61.     bne    iloprerr        ;<式>が定数でない
  62. pseudo_tail_check:
  63.     tst.w    (a0)
  64.     bne    iloprerr_pseudo_tail
  65.     rts
  66.  
  67. ;----------------------------------------------------------------
  68. iloprerr_pseudo_tail:
  69.     cmpi.w    #','|OT_CHAR,(a0)    ;行が終了していない
  70.     beq    iloprerr_pseudo_many
  71.     bra    iloprerr
  72.  
  73. ;----------------------------------------------------------------
  74. ;    .align    <式>[,<パディング値>]
  75. ~~align::
  76.     tst.b    (OFFSYMMOD,a6)
  77.     bgt    offsymalignerr        ;.offsymでシンボル指定があるときアラインメント処理できない
  78.     bsr    calcconst
  79.     move.l    d1,d2
  80.     moveq.l    #2,d0
  81.     cmp.l    d0,d2
  82.     bcs    ilvalueerr        ;<式>が0か1ならエラー
  83.     move.w    #T_ALIGN|$FF,d0
  84. ~~align1:
  85.     addq.b    #1,d0
  86.     lsr.l    #1,d2
  87.     bcc    ~~align1
  88.     bne    ilvalueerr        ;2の累乗でないのでエラー
  89.     cmp.b    #8,d0
  90.     bhi    ilvalueerr        ;2^8(=256)以上ならエラー
  91.     move.w    (a0)+,d2
  92.     beq    ~~align4        ;パディング値の指定がない
  93.     cmp.w    #','|OT_CHAR,d2
  94.     bne    iloprerr
  95.     movem.l    d0-d1,-(sp)
  96.     lea.l    (RPNBUF,a6),a1
  97.     bsr    convrpn
  98.     tst.w    d0
  99.     bmi    exprerr            ;式変換に失敗
  100.     bsr    calcrpn
  101.     tst.w    d0
  102.     bne    iloprerr        ;<式>が定数でない
  103.     moveq.l    #SZ_WORD,d2
  104.     bsr    chkdtsize        ;式の値がワードの範囲内か調べる
  105.     tst.w    (a0)
  106.     bne    iloprerr_pseudo_tail
  107.     move.l    d1,d3
  108.     movem.l    (sp)+,d0-d1
  109.     bra    ~~align5
  110.  
  111. ~~align4:
  112.     moveq.l    #0,d3            ;パディング値
  113.     cmpi.b    #SECT_TEXT,(SECTION,a6)
  114.     bne    ~~align5
  115.     move.w    #$4E71,d3        ;.textセクションでは境界をnopで埋める
  116. ~~align5:
  117.     tst.b    (SECTION,a6)
  118.     beq    ~~align6
  119.     st.b    (MAKEALIGN,a6)        ;オブジェクトファイルにアラインメント情報を出力する
  120.     cmp.b    (MAXALIGN,a6),d0
  121.     bls    ~~align6
  122.     move.b    d0,(MAXALIGN,a6)    ;ソース中で最大のアライン値の場合
  123. ~~align6:
  124.     bsr    wrtobjd0w
  125.     move.w    d3,d0
  126.     bsr    wrtd0w            ;パディング値
  127.     subq.l    #1,d1
  128.     move.l    (LOCATION,a6),d0
  129.     move.l    d0,d2
  130.     add.l    d1,d0
  131.     not.l    d1
  132.     and.l    d1,d0
  133.     move.l    d0,(LOCATION,a6)
  134.     move.l    d0,(LTOPLOC,a6)
  135.     sub.l    d2,d0            ;パディング長
  136.     bra    wrtd0w            ;(最大255bytesなのでワードでOk)
  137.  
  138. ;----------------------------------------------------------------
  139. ;    .quad
  140. ~~quad::
  141.     tst.b    (OFFSYMMOD,a6)
  142.     bgt    offsymalignerr        ;.offsymでシンボル指定があるときアラインメント処理できない
  143.     move.w    #T_ALIGN|2,d0        ;.quad = .align 4(=2^2)
  144.     moveq.l    #4,d1
  145.     bra    ~~align4
  146.  
  147. ;----------------------------------------------------------------
  148. ;    .even
  149. ~~even::
  150.     tst.b    (OFFSYMMOD,a6)
  151.     bgt    offsymalignerr        ;.offsymでシンボル指定があるときアラインメント処理できない
  152.     btst.b    #0,(LOCATION+3,a6)
  153.     beq    ~~even1
  154.     moveq.l    #0,d0
  155.     bsr    wrt1bobj        ;$00を出力して偶数境界に合わせる
  156.     addq.l    #1,(LTOPLOC,a6)
  157. ~~even1:
  158.     rts
  159.  
  160. ;----------------------------------------------------------------
  161. f43gcut::
  162.     tst.b    (F43GTEST,a6)
  163.     beq    f43gcut1
  164.     move.l    a0,-(sp)
  165.     movea.l    (F43GPTR,a6),a0
  166.     movea.l    (a0),a0            ;次のレコード
  167.     move.l    a0,(F43GPTR,a6)
  168. ;    clr.l    (8,a0)
  169.     clr.w    (12,a0)
  170.     movea.l    (sp)+,a0
  171. f43gcut1:
  172.     rts
  173.  
  174. ;----------------------------------------------------------------
  175. ;    .dc[.<サイズ>]    <式>[,<式>,…]
  176. ~~dc::
  177.     bsr    f43gcut
  178.     bsr    encodeopr
  179.     move.b    (CMDOPSIZE,a6),d0
  180.     bmi    ~~dc0
  181.     cmp.b    #SZ_SINGLE,d0
  182.     bcc    dodcreal        ;浮動小数点実数の.dc
  183.     tst.b    d0
  184.     bne    ~~dc1
  185.     move.b    #SZ_SHORT,(CMDOPSIZE,a6)    ;.b→.s
  186.     bra    ~~dc2
  187.  
  188. ~~dc0:
  189.     move.b    #SZ_WORD,(CMDOPSIZE,a6)
  190. ~~dc1:
  191. ~~dc2:
  192.     lea.l    (OPRBUF,a6),a0
  193. ~~dc3:
  194.     bsr    dodcparam        ;パラメータ1つについて処理
  195.     move.w    (a0)+,d0
  196.     beq    ~~dc9
  197.     cmp.w    #','|OT_CHAR,d0
  198.     beq    ~~dc3
  199.     bra    iloprerr
  200.  
  201. ~~dc9:
  202.     rts
  203.  
  204. ;----------------------------------------------------------------
  205. ;    .dcのパラメータ1つの処理
  206. dodcparam:
  207.     move.w    (a0),d0
  208.     beq    iloprerr        ;パラメータがない
  209.     cmp.w    #','|OT_CHAR,d0
  210.     beq    dodcparam9        ;','のみ
  211.     and.w    #$FF00,d0
  212.     cmp.w    #OT_STR,d0        ;文字列
  213.     bne    dodcnum
  214. dodcparam01:
  215.     movea.l    a0,a1
  216.     moveq.l    #0,d0
  217.     move.b    (1,a0),d0        ;文字列長
  218.     addq.l    #3,d0
  219.     bclr.l    #0,d0
  220.     adda.l    d0,a1            ;文字列の終了アドレス
  221.     move.w    (a1),d0
  222.     beq    dodcstr            ;文字列のみの場合
  223.     cmp.w    #','|OT_CHAR,d0
  224.     beq    dodcstr
  225.     and.w    #$FF00,d0
  226.     cmp.w    #OT_STR,d0
  227.     bne    dodcnum
  228.     bsr    dodcstr            ;とりあえず1番目の文字列を処理しておく
  229.     bra    dodcparam01
  230.  
  231. dodcnum:                ;パラメータ式
  232.     lea.l    (RPNBUF,a6),a1
  233.     bsr    convrpn
  234.     tst.w    d0
  235.     bmi    exprerr            ;式が変換できない
  236.     move.w    d1,d2
  237.     bsr    calcrpn
  238.     move.w    d0,d3
  239.     move.b    (EXPRSIZE,a6),d0    ;式のサイズ
  240.     bpl    dodcnum11
  241.     cmpi.b    #OT_SIZE>>8,(a0)
  242.     bne    dodcnum1        ;式に後続するサイズ指定がない
  243.     move.w    (a0)+,d0        ;式に後続するサイズ
  244. dodcnum11:
  245.     tst.b    d0            ;cmp.b #SZ_BYTE,d0
  246.     bne    dodcnum0
  247.     move.b    #SZ_SHORT,d0        ;.b→.s
  248.     bra    dodcnum3
  249.  
  250. dodcnum0:
  251.     cmp.b    #SZ_SINGLE,d0
  252.     bcc    ilsizeerr        ;実数は受け付けない(.bの意味になっていた.sも不可)
  253.     bra    dodcnum2        ;サイズ指定がある
  254.  
  255. dodcnum1:
  256.     move.b    (CMDOPSIZE,a6),d0    ;サイズ指定がないので.dcのサイズを使う
  257. dodcnum2:
  258.     cmp.b    #SZ_SHORT,d0
  259.     beq    dodcnum3
  260.     btst.b    #0,(LOCATION+3,a6)
  261.     beq    dodcnum3
  262.     bsr    alignwarn        ;偶数境界に合っていないのでワーニングを出す
  263. dodcnum3:
  264.     tst.w    d3
  265.     beq    wrtimm            ;定数ならファイルに出力
  266.     cmp.b    #SZ_SHORT,d0
  267.     beq    dodcnumb
  268.     cmp.b    #SZ_WORD,d0
  269.     beq    dodcnumw
  270.     add.l    #2,(LOCATION,a6)    ;.l
  271. dodcnumw:
  272.     add.l    #1,(LOCATION,a6)
  273. dodcnumb:
  274.     add.l    #1,(LOCATION,a6)
  275.     move.w    d2,d1            ;式のワード数
  276.     bra    wrtrpn            ;式をファイルに出力
  277.  
  278. dodcstr:                ;パラメータ文字列
  279.     move.w    (a0)+,d1        ;d1.b=文字列長
  280.     and.w    #$00FF,d1
  281.     beq    dodcstrlw9        ;ヌルストリング
  282.     move.b    (CMDOPSIZE,a6),d2
  283.     cmp.b    #SZ_SHORT,d2
  284.     beq    dodcstrb
  285.     ext.w    d2            ;.w/.lでの文字列書き込み
  286.     add.w    d2,d2
  287.     subq.w    #1,d2
  288. dodcstrlw:
  289.     moveq.l    #0,d0
  290.     move.w    d2,d3
  291. dodcstrlw1:
  292.     lsl.l    #8,d0
  293.     move.b    (a0)+,d0
  294.     subq.b    #1,d1
  295.     dbeq    d3,dodcstrlw1
  296.     cmpi.b    #SZ_WORD,(CMDOPSIZE,a6)
  297.     beq    dodcstrlw2
  298.     bsr    wrt1lobj
  299.     bra    dodcstrlw3
  300.  
  301. dodcstrlw2:
  302.     bsr    wrt1wobj
  303. dodcstrlw3:
  304.     tst.b    d1
  305.     bne    dodcstrlw
  306. dodcstrlw9:
  307.     move.l    a0,d0
  308.     doeven    d0
  309.     movea.l    d0,a0
  310. dodcparam9
  311.     rts
  312.  
  313. dodcstrb:                ;.bでの文字列書き込み
  314.     move.b    (a0)+,d0
  315.     bsr    wrt1bobj
  316.     subq.b    #1,d1
  317.     bne    dodcstrb
  318.     bra    dodcstrlw9
  319.  
  320. ;----------------------------------------------------------------
  321. ;    浮動小数点実数の.dc
  322. dodcreal:
  323.     btst.b    #0,(LOCATION+3,a6)
  324.     beq    dodcreal1
  325.     bsr    alignwarn        ;偶数境界に合っていないのでワーニングを出す
  326. dodcreal1:
  327.     lea.l    (OPRBUF,a6),a0
  328.     tst.w    (a0)
  329.     beq    iloprerr        ;パラメータがない
  330. dodcreal2:
  331.     lea.l    (RPNBUFEX,a6),a3    ;オペランド用バッファ
  332.     bsr    getdcreal        ;浮動小数点実数オペランドを得る
  333. dodcreal3:
  334.     move.l    (a3)+,d0
  335.     bsr    wrt1lobj        ;得られたデータを出力する
  336.     dbra    d5,dodcreal3
  337.     move.w    (a0)+,d0
  338.     beq    dodcreal9
  339.     cmp.w    #','|OT_CHAR,d0
  340.     beq    dodcreal2
  341.     bra    iloprerr
  342.  
  343. dodcreal9:
  344.     rts
  345.  
  346. ;----------------------------------------------------------------
  347. ;    浮動小数点実数オペランドを一つ得る
  348. getdcreal:
  349.     movea.l    a3,a4
  350.     move.b    (CMDOPSIZE,a6),d0
  351.     bsr    getfplen        ;データ長を得る
  352.     move.w    d0,d4
  353.     move.w    d1,d3
  354.     move.w    d1,d5
  355.     lea.l    (RPNBUF,a6),a1
  356.     bsr    convrpn
  357.     tst.w    d0
  358.     bpl    getdcreal6        ;内部表現形式の値を得る
  359.     bsr    calcfexpr        ;浮動小数点式を得る
  360.     movem.l    d0-d2,(a3)
  361.     rts
  362.  
  363. getdcreal5:
  364.     cmpi.w    #','|OT_CHAR,(a0)+
  365.     bne    iloprerr
  366.     lea.l    (RPNBUF,a6),a1
  367.     bsr    convrpn
  368.     tst.w    d0
  369.     bmi    iloprerr        ;式が得られない
  370. getdcreal6:
  371.     bsr    calcrpn
  372.     tst.w    d0
  373.     bne    iloprerr_not_fixed    ;式が定数でない
  374.     move.l    d1,(a4)+
  375.     dbra    d3,getdcreal5
  376.     rts
  377.  
  378. ;----------------------------------------------------------------
  379. ;    .dcb[.<サイズ>]    <長さ>,<式>
  380. ~~dcb::
  381.     bsr    encodeopr
  382.     tst.b    (CMDOPSIZE,a6)
  383.     beq    ~~dcb1            ;.bの場合
  384.     btst.b    #0,(LOCATION+3,a6)
  385.     beq    ~~dcb1
  386.     bsr    alignwarn        ;偶数境界に合っていないのでワーニングを出す
  387. ~~dcb1:
  388.     bsr    calcopr
  389.     tst.w    d0
  390.     bne    ilvalueerr        ;<長さ>が定数でない
  391.     subq.l    #1,d1
  392.     bcs    ~~dcb9            ;<長さ>が0の場合は何もしない
  393.     cmp.l    #$FFFF,d1
  394.     bcc    ilvalueerr        ;<長さ>は1~65535
  395.     move.w    d1,-(sp)
  396.     cmpi.w    #','|OT_CHAR,(a0)+
  397.     bne    iloprerr        ;,<式>がない
  398.     cmpi.b    #SZ_SINGLE,(CMDOPSIZE,a6)
  399.     bge    ~~dcb10            ;浮動小数点実数の.dcb
  400.     lea.l    (RPNBUF,a6),a1
  401.     bsr    convrpn
  402.     tst.w    d0
  403.     bmi    exprerr            ;式変換に失敗
  404.     tst.w    (a0)
  405.     bne    iloprerr_pseudo_tail    ;行が終了していない
  406.     moveq.l    #0,d0
  407.     move.w    (sp),d0            ;<長さ>-1
  408.     addq.w    #1,d0
  409.     move.b    (CMDOPSIZE,a6),d2
  410.     bmi    ~~dcb2
  411.     bne    ~~dcb3
  412.     move.b    #SZ_SHORT,(CMDOPSIZE,a6)    ;.b→.s
  413.     bra    ~~dcb7
  414.  
  415. ~~dcb2:
  416.     move.b    #SZ_WORD,(CMDOPSIZE,a6)    ;省略時は.w
  417.     bra    ~~dcb6
  418.  
  419. ~~dcb3:
  420.     cmp.b    #SZ_WORD,d2
  421.     beq    ~~dcb6
  422.     add.l    d0,d0            ;.l
  423. ~~dcb6:
  424.     add.l    d0,d0            ;.w
  425. ~~dcb7:
  426.     add.l    d0,(LOCATION,a6)
  427.     move.w    #T_DCB,d0
  428.     bsr    wrtobjd0w
  429.     move.w    (sp)+,d0
  430.     bsr    wrtd0w            ;長さ-1
  431.     move.b    (CMDOPSIZE,a6),d0
  432.     bra    wrtrpn
  433.  
  434. ~~dcb9:
  435.     rts
  436.  
  437. ~~dcb10:                ;浮動小数点実数の.dcb
  438.     lea.l    (RPNBUFEX,a6),a3    ;オペランド用バッファ
  439.     bsr    getdcreal        ;浮動小数点実数オペランドを得る
  440.     move.w    d5,d4
  441.     moveq.l    #0,d0
  442.     move.w    (sp),d0            ;<長さ>-1
  443.     addq.w    #1,d0
  444.     add.l    d0,d0
  445.     add.l    d0,d0
  446.     moveq.l    #0,d1
  447. ~~dcb11:
  448.     add.l    d1,d0
  449.     dbra    d5,~~dcb11
  450.     add.l    d1,(LOCATION,a6)
  451.     move.w    #T_FDCB,d0
  452.     move.b    d4,d0            ;データ長-1
  453.     bsr    wrtobjd0w
  454.     move.w    (sp)+,d0
  455.     bsr    wrtd0w            ;長さ-1
  456.     moveq.l    #3-1,d1
  457. ~~dcb12:
  458.     move.l    (a3)+,d0
  459.     bsr    wrtd0l            ;シンボル値
  460.     dbra    d1,~~dcb12
  461.     rts
  462.  
  463. ;----------------------------------------------------------------
  464. ;    .ds[.<サイズ>]    <長さ>
  465. ~~ds::
  466.     bsr    deflabel        ;行頭のラベルを定義
  467.     move.w    #-1,(LABNAMELEN,a6)
  468.     bsr    encodeopr
  469.     bsr    calcopr
  470.     tst.w    d0
  471.     bne    ilvalueerr        ;<長さ>が定数でない
  472.     tst.w    (a0)
  473.     bne    iloprerr_pseudo_tail    ;行が終了していない
  474.     tst.l    d1
  475.     bmi    ds_iloprerr_ds_negative
  476. ~~ds_0:
  477.     move.b    (CMDOPSIZE,a6),d0
  478.     bmi    ~~ds_w
  479.     tst.b    d0            ;cmp.b #SZ_BYTE,d0
  480.     beq    ~~ds_b
  481.     cmp.b    #SZ_WORD,d0
  482.     beq    ~~ds_w
  483.     cmp.b    #SZ_LONG,d0
  484.     beq    ~~ds_l
  485.     cmp.b    #SZ_SINGLE,d0
  486.     beq    ~~ds_s
  487.     cmp.b    #SZ_DOUBLE,d0
  488.     beq    ~~ds_d
  489.     move.l    d1,d2            ;.x/.p    (12bytes)
  490.     add.l    d2,d1
  491.     add.l    d2,d1            ;3×4=12倍
  492.     bra    ~~ds_l
  493.  
  494. ~~ds_d:                    ;.d    (8bytes)
  495.     add.l    d1,d1
  496. ~~ds_l:                    ;.l/.s    (4bytes)
  497. ~~ds_s:
  498.     add.l    d1,d1
  499. ~~ds_w:                    ;.w    (2bytes)
  500.     add.l    d1,d1
  501.     btst.b    #0,(LOCATION+3,a6)
  502.     beq    ~~ds_b
  503.     bsr    alignwarn        ;偶数境界に合っていないのでワーニングを出す
  504. ~~ds_b:                    ;.b    (1byte)
  505.     add.l    d1,(LOCATION,a6)
  506.     move.w    #T_DS,d0
  507.     bsr    wrtobjd0w
  508.     move.l    d1,d0
  509.     bra    wrtd0l            ;長さ(バイト単位)
  510.  
  511. ds_iloprerr_ds_negative:
  512.     move.b    (SECTION,a6),d0
  513.     subq.b    #SECT_TEXT,d0
  514.     beq    iloprerr_ds_negative
  515.     subq.b    #SECT_DATA-SECT_TEXT,d0
  516.     beq    iloprerr_ds_negative
  517.     bsr    ds_negative_warn
  518.     bra    ~~ds_0
  519.  
  520. ;----------------------------------------------------------------
  521. ;    .fpid    <式>    (0~7)
  522. ~~fpid::
  523.     bsr    calcconst
  524.     tst.l    d1
  525.     bmi    ~~fpid9
  526.     cmp.l    #7,d1
  527.     bhi    ilvalueerr
  528.     ror.w    #7,d1            ;コプロセッサIDフィールドはb9~11
  529.     move.w    d1,(FPCPID,a6)
  530.     rts
  531.  
  532. ~~fpid9:                ;負の値が指定されたらFPP命令を禁止する
  533.     andi.w    #CFPP.xor.$FFFF,(CPUTYPE,a6)
  534.     rts
  535.  
  536. ;----------------------------------------------------------------
  537. ;    .pragma    <最適化指定オペランド>
  538. ~~pragma::
  539.     rts
  540.  
  541. ;----------------------------------------------------------------
  542. ;    <シンボル>    fset[.<サイズ>]    <式>
  543. ~~fset::
  544.     moveq.l    #ST_REAL,d2
  545.     bsr    defltopsym        ;行頭のシンボルを定義する
  546.     bra    ~~fequ1
  547.  
  548. ;----------------------------------------------------------------
  549. ;    <シンボル>    fequ[.<サイズ>]    <式>
  550. ~~fequ::
  551.     moveq.l    #ST_REAL,d2
  552.     bsr    defltopsym        ;行頭のシンボルを定義する
  553.     tst.w    d2
  554.     bmi    pseudo_redeferr_a1    ;すでに定義済み
  555. ~~fequ1:
  556.     movea.l    a1,a2            ;シンボルテーブルへのポインタ
  557.     move.l    (TEMPPTR,a6),d0
  558.     doquad    d0
  559.     movea.l    d0,a3
  560.     move.l    d0,(SYM_FVPTR,a2)    ;シンボル値へのポインタ
  561.     addq.l    #8,d0
  562.     addq.l    #4,d0            ;(最大で12bytes)
  563.     move.l    d0,(TEMPPTR,a6)
  564.     bsr    memcheck
  565.     st.b    (SYM_FSIZE,a2)        ;(move.b #-1,(SYM_FSIZE,a2))
  566.     lea.l    (OPRBUF,a6),a0
  567.     bsr    getdcreal        ;浮動小数点実数オペランドを得る
  568.     tst.w    (a0)
  569.     bne    iloprerr_pseudo_tail    ;行が終了していない
  570.     move.w    #T_FEQUSET,d0        ;fequ/fset
  571.     move.b    d4,(SYM_FSIZE,a2)    ;サイズ
  572.     move.b    d4,d0
  573.     bsr    wrtobjd0w
  574.     move.l    a2,d0
  575.     bsr    wrtd0l            ;シンボルへのポインタ
  576.     move.l    (SYM_FVPTR,a2),a1
  577.     moveq.l    #3-1,d1
  578. ~~fequ6:
  579.     move.l    (a1)+,d0
  580.     bsr    wrtd0l            ;シンボル値
  581.     dbra    d1,~~fequ6
  582.     rts
  583.  
  584. ;----------------------------------------------------------------
  585. ;    行頭のシンボルを定義する
  586. defltopsym:
  587.     move.w    d2,-(sp)
  588.     bsr    encodeopr
  589.     move.w    (LABNAMELEN,a6),d1
  590.     bmi    nosymerr_pseudo        ;定義すべきシンボルがない
  591.     move.w    #-1,(LABNAMELEN,a6)    ;定義するのでラベルを取り消す
  592.     movea.l    (LABNAMEPTR,a6),a0
  593.     bsr    isdefdsym
  594.     move.w    (sp)+,d2
  595.     tst.w    d0
  596.     bne    defsymbol        ;未登録なら新しく登録する
  597.     cmp.b    (SYM_TYPE,a1),d2    ;シンボルのタイプ
  598.     bne    defltopsym02        ;タイプの異なるシンボルと重複している
  599.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  600.     bne    defltopsym99
  601.     cmpi.b    #SA_PREDEFINE,(SYM_ATTRIB,a1)
  602.     beq    defltopsym01        ;プレデファインシンボルを再定義しようとした
  603. defltopsym99:
  604.     moveq.l    #-1,d2
  605.     rts
  606.  
  607. defltopsym01:
  608.     move.l    a1,(ERRMESSYM,a6)
  609.     bra    redeferr_predefine
  610.  
  611. defltopsym02:
  612.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  613.     bne    pseudo_ilsymerr_a1    ;タイプの異なるシンボルと重複している
  614.     cmpi.b    #SA_UNDEF,(SYM_ATTRIB,a1)
  615.     bne    pseudo_ilsymerr_a1    ;タイプの異なるシンボルと重複している
  616.     move.l    a1,(ERRMESSYM,a6)
  617.     bra    ilsymerr_lookfor    ;シンボルの前方参照の条件と矛盾している
  618.  
  619. ;----------------------------------------------------------------
  620. pseudo_ilsymerr_a1:
  621.     move.l    a1,(ERRMESSYM,a6)
  622.     move.b    (SYM_TYPE,a1),d0
  623.     beq    ilsymerr_value        ;ST_VALUE
  624.     subq.b    #ST_REAL,d0
  625.     bcs    ilsymerr_local        ;ST_LOCAL
  626.     beq    ilsymerr_real        ;ST_REAL
  627.     subq.b    #ST_REGSYM-ST_REAL,d0
  628.     beq    ilsymerr_regsym        ;ST_REGSYM
  629.     bra    ilsymerr_register    ;ST_REGISTER
  630.  
  631. ;----------------------------------------------------------------
  632. pseudo_redeferr_a0:
  633.     move.l    a0,(ERRMESSYM,a6)
  634.     bra    redeferr
  635.  
  636. ;----------------------------------------------------------------
  637. pseudo_redeferr_a1:
  638.     move.l    a1,(ERRMESSYM,a6)
  639.     bra    redeferr
  640.  
  641. ;----------------------------------------------------------------
  642. ;    <シンボル>    set    <式>
  643. ~~set::
  644.     moveq.l    #ST_VALUE,d2
  645.     bsr    defltopsym        ;行頭のシンボルを定義する
  646.     tst.b    (SYM_ATTRIB,a1)        ;(cmpi.b #SA_UNDEF,(SYM_ATTRIB,a1))
  647.     beq    ~~set1            ;未定義
  648.     tst.b    (SYM_FIRST,a1)
  649.     blt    ~~set1            ;setで定義されている
  650.     move.l    a1,(ERRMESSYM,a6)
  651.     tst.b    (OWSET,a6)
  652.     bne    redeferr_set
  653.     bsr    redefwarn_set
  654. ~~set1:
  655.     st.b    (SYM_FIRST,a1)
  656.     moveq.l    #-1,d2
  657.     bra    ~~equ1
  658.  
  659. ;----------------------------------------------------------------
  660. ;    <シンボル>    equ    <式>
  661. ~~equ::
  662.     moveq.l    #ST_VALUE,d2
  663.     bsr    defltopsym        ;行頭のシンボルを定義する
  664.     tst.b    (SYM_ATTRIB,a1)        ;(cmpi.b #SA_UNDEF,(SYM_ATTRIB,a1))
  665.     bne    pseudo_redeferr_a1    ;定義済シンボルならエラー
  666.     sf.b    (SYM_FIRST,a1)
  667.     moveq.l    #0,d2
  668. ~~equ1:
  669.     cmpi.b    #SECT_RLCOMM,(SYM_EXTATR,a1)
  670.     bcc    pseudo_redeferr_a1    ;.xref/.commシンボルだった
  671.     movea.l    a1,a2            ;シンボルテーブルへのポインタ
  672.     lea.l    (OPRBUF,a6),a0
  673.     lea.l    (RPNBUF,a6),a1
  674.     bsr    convrpn
  675.     tst.w    d0
  676.     bne    exprerr            ;式が数値のみではないのでエラー
  677.     move.w    d1,d3            ;式のワード数
  678.     bsr    calcrpn
  679.     tst.w    (a0)
  680.     bne    iloprerr_pseudo_tail    ;行が終了していない
  681.     movea.l    a2,a1
  682.     tst.b    d0
  683.     bne    ~~equ2            ;式が定数でない
  684.     clr.w    (SYM_SECTION,a1)    ;(SYM_ORGNUM)
  685.     move.b    #SA_DEFINE,(SYM_ATTRIB,a1)    ;定義済シンボル
  686.     move.l    d1,(SYM_VALUE,a1)    ;シンボル値
  687.     move.w    #T_EQUCONST,d0        ;定数のequ/set
  688.     bsr    wrtobjd0w
  689.     move.l    a1,d0
  690.     bsr    wrtd0l            ;シンボルへのポインタ
  691.     move.l    d1,d0
  692.     bsr    wrtd0l            ;シンボル値
  693.     bra    ~~equ3
  694.  
  695. ~~equ2:
  696.     move.b    #SA_NODET,(SYM_ATTRIB,a1)    ;値が未定のシンボル
  697.     move.w    #T_EQUEXPR,d0        ;式・アドレスのequ/set
  698.     bsr    wrtobjd0w
  699.     move.l    a1,d0
  700.     bsr    wrtd0l            ;シンボルへのポインタ
  701.     lea.l    (RPNBUF,a6),a1
  702.     move.w    d3,d1            ;式のワード数
  703.     moveq.l    #SZ_LONG,d0
  704.     bsr    wrtrpn            ;式を出力
  705. ~~equ3:
  706.     tst.b    (LABXDEF,a6)
  707.     beq    ~~equ9            ;外部定義はしない
  708.     movea.l    a2,a1
  709.     move.b    #SECT_XDEF,(SYM_EXTATR,a1)
  710. ~~equ9:
  711.     rts
  712.  
  713. ;----------------------------------------------------------------
  714. ;    <シンボル>    reg    <レジスタリスト>
  715. ~~reg::
  716.     moveq.l    #ST_REGSYM,d2
  717.     bsr    defltopsym        ;行頭のシンボルを定義する
  718.     lea.l    (OPRBUF,a6),a2
  719.     move.l    (TEMPPTR,a6),d0
  720.     doeven    d0
  721.     movea.l    d0,a0
  722.     move.l    d0,(SYM_DEFINE,a1)    ;定義内容へのポインタ
  723.     clr.w    d1
  724. ~~reg3:
  725.     move.w    (a2)+,d0
  726.     move.w    d0,(a0)+
  727.     beq    ~~reg9            ;中間コードが終了
  728.     addq.w    #1,d1
  729.     move.b    d0,d2
  730.     and.w    #$FF00,d0
  731.     cmp.w    #OT_VALUEW,d0
  732.     beq    ~~reg5
  733.     cmp.w    #OT_LOCALREF,d0
  734.     beq    ~~reg5
  735.     cmp.w    #OT_VALUE,d0
  736.     beq    ~~reg6
  737.     cmp.w    #OT_SYMBOL,d0
  738.     beq    ~~reg6
  739.     cmp.w    #OT_VALUEQ,d0
  740.     beq    ~~reg8
  741.     cmp.w    #OT_REAL,d0
  742.     beq    ~~reg7
  743.     cmp.w    #OT_STR,d0
  744.     bne    ~~reg3
  745.     tst.b    d2            ;文字列
  746.     beq    ~~reg3            ;ヌルストリング
  747. ~~reg4:
  748.     move.w    (a2)+,(a0)+        ;文字列の内容を転送
  749.     addq.w    #1,d1
  750.     subq.b    #2,d2
  751.     bhi    ~~reg4
  752.     bra    ~~reg3
  753.  
  754. ~~reg5:                    ;16bit数値/ローカルラベル参照
  755.     move.w    (a2)+,(a0)+
  756.     addq.w    #1,d1
  757.     bra    ~~reg3
  758.  
  759. ~~reg6:                    ;32bit数値/シンボル
  760.     move.l    (a2)+,(a0)+
  761.     addq.w    #2,d1
  762.     bra    ~~reg3
  763.  
  764. ~~reg7:                    ;浮動小数点実数
  765.     move.w    (a2)+,(a0)+
  766.     move.l    (a2)+,(a0)+
  767.     move.l    (a2)+,(a0)+
  768.     addq.w    #5,d1
  769.     bra    ~~reg3
  770.  
  771. ~~reg8:                    ;64bit数値
  772.     move.l    (a2)+,(a0)+
  773.     move.l    (a2)+,(a0)+
  774.     addq.w    #4,d1
  775.     bra    ~~reg3
  776.  
  777. ~~reg9:                    ;定義内容をすべて転送した
  778.     move.l    a0,(TEMPPTR,a6)
  779.     move.w    d1,(SYM_DEFLEN,a1)    ;中間コードのワード数
  780.     bra    memcheck
  781.  
  782. ;----------------------------------------------------------------
  783. ;    .xdef    <シンボル>[,<シンボル>,…]
  784. ~~xdef::
  785.     moveq.l    #SECT_XDEF,d2
  786.     bra    ~~globl1
  787.  
  788. ;---------------------------------------------------------------
  789. ;    .xref    <シンボル>[,<シンボル>,…]
  790. ~~xref::
  791.     moveq.l    #SECT_XREF,d2
  792.     bra    ~~globl1
  793.  
  794. ;---------------------------------------------------------------
  795. ;    .globl    <シンボル>[,<シンボル>,…]
  796. ~~globl::
  797.     moveq.l    #SECT_GLOBL,d2
  798. ~~globl1:
  799.     move.w    d2,-(sp)
  800.     bsr    encodeopr
  801.     move.w    (sp)+,d2
  802.     lea.l    (OPRBUF,a6),a1
  803. ~~globl2:
  804.     move.w    (a1)+,d0
  805.     cmp.w    #OT_SYMBOL,d0
  806.     bne    iloprerr        ;シンボル以外の記述はエラー
  807.     move.l    (a1)+,a0        ;シンボルテーブルへのポインタ
  808.     tst.b    (SYM_TYPE,a0)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a0)
  809.     bne    iloprerr        ;数値シンボルでないのでエラー
  810.     cmpi.b    #SA_PREDEFINE,(SYM_ATTRIB,a0)
  811.     beq    ~~globl00        ;プレデファインシンボルは外部宣言できない
  812.     move.b    (SYM_EXTATR,a0),d1
  813.     beq    ~~globl3
  814.     cmp.b    #SECT_RLCOMM,d1
  815.     bcs    pseudo_redeferr_a0
  816.     cmp.b    #SECT_COMM,d1
  817.     bhi    pseudo_redeferr_a0    ;すでに外部宣言されている(.comm以外)
  818. ~~globl3:
  819.     tst.b    (SYM_ATTRIB,a0)
  820.     beq    ~~globl4        ;未定義シンボル
  821.     cmpi.b    #SECT_XREF,d2
  822.     beq    pseudo_redeferr_a0    ;定義済シンボルに対する.xrefはエラー
  823. ~~globl4:
  824.     move.b    d2,(SYM_EXTATR,a0)    ;外部宣言属性をセット
  825.     cmpi.b    #SECT_XDEF,d2
  826.     bne    ~~globl5
  827.     move.w    #T_XDEF,d0
  828.     bsr    wrtobjd0w
  829.     move.l    a0,d0            ;シンボルへのポインタ
  830.     bsr    wrtd0l
  831. ~~globl5:
  832.     move.w    (a1)+,d0
  833.     beq    ~~globl9
  834.     cmp.w    #','|OT_CHAR,d0
  835.     beq    ~~globl2        ;まだシンボルがある
  836.     bra    iloprerr
  837.  
  838. ~~globl9:
  839.     rts
  840.  
  841. ~~globl00:
  842.     move.l    a0,(ERRMESSYM,a6)
  843.     cmp.b    #SECT_XDEF,d2
  844.     beq    ilsymerr_predefxdef
  845.     cmp.b    #SECT_XREF,d2
  846.     beq    ilsymerr_predefxref
  847.     cmp.b    #SECT_GLOBL,d2
  848.     bra    ilsymerr_predefglobl
  849.  
  850. ;---------------------------------------------------------------
  851. ;    .rcomm/.rlcomm
  852. ~~rcomm::
  853.     move.w    #SECT_RCOMM,d2
  854.     bra    ~~comm1
  855.  
  856. ~~rlcomm::
  857.     move.w    #SECT_RLCOMM,d2
  858.     bra    ~~comm1
  859.  
  860. ;---------------------------------------------------------------
  861. ;    .comm    <シンボル>,<式>
  862. ~~comm::
  863.     move.w    #SECT_COMM,d2
  864. ~~comm1:
  865.     move.w    d2,-(sp)
  866.     bsr    encodeopr
  867.     move.w    (sp)+,d2
  868.     lea.l    (OPRBUF,a6),a1
  869.     move.w    (a1)+,d0
  870.     cmp.w    #OT_SYMBOL,d0
  871.     bne    iloprerr        ;シンボル以外の記述はエラー
  872.     move.l    (a1)+,a0        ;シンボルテーブルへのポインタ
  873.     tst.b    (SYM_TYPE,a0)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a0)
  874.     bne    iloprerr        ;数値シンボルでないのでエラー
  875.     tst.b    (SYM_ATTRIB,a0)
  876.     bne    pseudo_redeferr_a0    ;定義済シンボルならエラー
  877. ;プレデファインシンボルは上で弾かれるのでこのままでよい
  878.     move.b    d2,(SYM_EXTATR,a0)
  879.     cmpi.w    #','|OT_CHAR,(a1)+
  880.     bne    iloprerr        ;,<式>がない
  881.     move.l    a0,-(sp)
  882.     movea.l    a1,a0
  883.     lea.l    (RPNBUF,a6),a1
  884.     bsr    convrpn
  885.     tst.w    d0
  886.     bmi    exprerr            ;式変換に失敗
  887.     tst.b    (EXPRISSTR,a6)
  888.     bne    iloprerr        ;式に文字列を含んでいた
  889.     bsr    calcrpn
  890.     tst.w    d0
  891.     bne    iloprerr        ;式が定数でない
  892.     tst.l    d1
  893.     ble    ilvalueerr        ;式が負か0だった
  894.     tst.w    (a0)
  895.     bne    iloprerr_pseudo_tail    ;行が終了していない
  896.     movea.l    (sp)+,a0
  897.     move.l    d1,(SYM_VALUE,a0)    ;コモンエリアサイズをセット
  898.     rts
  899.  
  900. ;---------------------------------------------------------------
  901. ;    .text
  902. ~~text::
  903.     moveq.l    #SECT_TEXT,d0
  904. ~~text1:
  905. ;offsymの終了はセクションの変更が完了してから行うこと
  906. ;d0=セクション
  907.     move.b    (OFFSYMMOD,a6),-(sp)
  908.     sf.b    (OFFSYMMOD,a6)
  909.     bsr    chgsection
  910.     or.w    #T_SECT,d0        ;セクション変更
  911.     bsr    wrtobjd0w
  912.     tst.b    (sp)+
  913.     bgt    offsymtailchk1
  914.     rts
  915.  
  916. ;---------------------------------------------------------------
  917. ;    .data
  918. ~~data::
  919.     moveq.l    #SECT_DATA,d0
  920.     bra    ~~text1
  921.  
  922. ;---------------------------------------------------------------
  923. ;    .bss
  924. ~~bss::
  925.     moveq.l    #SECT_BSS,d0
  926.     bra    ~~text1
  927.  
  928. ;---------------------------------------------------------------
  929. ;    .stack
  930. ~~stack::
  931.     moveq.l    #SECT_STACK,d0
  932.     bra    ~~text1
  933.  
  934. ;---------------------------------------------------------------
  935. ~~rdata::
  936.     moveq.l    #SECT_RDATA,d0
  937. ~~rdata1:
  938.     st.b    (MAKERSECT,a6)
  939.     bra    ~~text1
  940.  
  941. ~~rbss::
  942.     moveq.l    #SECT_RBSS,d0
  943.     bra    ~~rdata1
  944.  
  945. ~~rstack::
  946.     moveq.l    #SECT_RSTACK,d0
  947.     bra    ~~rdata1
  948.  
  949. ~~rldata::
  950.     moveq.l    #SECT_RLDATA,d0
  951.     bra    ~~rdata1
  952.  
  953. ~~rlbss::
  954.     moveq.l    #SECT_RLBSS,d0
  955.     bra    ~~rdata1
  956.  
  957. ~~rlstack::
  958.     moveq.l    #SECT_RLSTACK,d0
  959.     bra    ~~rdata1
  960.  
  961. ;---------------------------------------------------------------
  962. ;    .offsym    <初期値>,<シンボル>
  963. ~~offsym::
  964.     move.b    (OFFSYMMOD,a6),-(sp)
  965.     move.l    (OFFSYMTMP,a6),-(sp)
  966.     st.b    (OFFSYMMOD,a6)        ;offsymでシンボルなし
  967.     bsr    calcconst        ;d1=初期値
  968.     cmpi.w    #','|OT_CHAR,(a0)
  969.     bne    ~~offsym1
  970.     addq.l    #2,a0
  971.     move.l    d1,(OFFSYMVAL,a6)    ;初期値
  972.     cmpi.w    #OT_SYMBOL,(a0)+
  973.     bne    iloprerr
  974.     movea.l    (a0)+,a1
  975.     tst.w    (a0)
  976.     bne    iloprerr_pseudo_tail    ;行が終了していない
  977. ;初期値を与えるシンボルの状態を確認する
  978. ;定義済みでもエラーにしない
  979.     tst.b    (SYM_TYPE,a1)        ;cmpi.b #ST_VALUE,(SYM_TYPE,a1)
  980.     bne    pseudo_ilsymerr_a1    ;タイプの異なるシンボルと重複している
  981.     cmpi.b    #SA_PREDEFINE,(SYM_ATTRIB,a1)
  982.     beq    pseudo_redeferr_a1
  983.     cmpi.b    #SECT_RLCOMM,(SYM_EXTATR,a1)
  984.     bcc    pseudo_redeferr_a1    ;.xref/.commシンボルだった
  985.     move.l    a1,(OFFSYMSYM,a6)    ;初期値を与えるシンボル
  986. ;仮のシンボルを用意する
  987.     move.l    #(SYMHASHSIZE-1)<<16,d1    ;上位ワードがローカルシンボル番号と一致しないこと
  988.                     ;ただしSYMHASHSIZE*65536以上にすると
  989.                     ;isdefdlocsymでオーバーフローするので注意
  990.     move.w    (OFFSYMNUM,a6),d1    ;ハッシュ関数値を分散させるためのカウンタ
  991.     addq.w    #1,(OFFSYMNUM,a6)
  992.     bsr    isdefdlocsym        ;ハッシュチェインの検索
  993.                     ;既存のシンボルとは絶対に一致しない
  994.     bsr    deflocsymbol        ;ローカルシンボルを登録する
  995.     move.l    a1,(OFFSYMTMP,a6)    ;初期値を与えるシンボルの位置の
  996.                     ;ロケーションカウンタを格納する仮のシンボル
  997.     move.b    #SA_NODET,(SYM_ATTRIB,a1)    ;定義されたが値が定まっていない
  998.                     ;ここでは式や値を出力しない
  999.     moveq.l    #SECT_ABS,d0
  1000.     bsr    chgsection
  1001.     clr.l    (LOCATION,a6)
  1002.     clr.l    (LTOPLOC,a6)
  1003.     move.w    #T_OFFSYM,d0
  1004.     bsr    wrtobjd0w
  1005.     move.l    (OFFSYMVAL,a6),d0    ;初期値
  1006.     bsr    wrtd0l
  1007.     move.l    (OFFSYMSYM,a6),d0    ;シンボル
  1008.     bsr    wrtd0l
  1009.     move.l    a1,d0            ;仮シンボル
  1010.     bsr    wrtd0l
  1011.     move.b    #1,(OFFSYMMOD,a6)    ;初期値をシンボルに与える
  1012.     bra    ~~offsym2
  1013.  
  1014. ~~offsym1:
  1015. ;d1=初期値
  1016.     bsr    ~~offset1        ;シンボルがなければ.offsetと同じ
  1017. ~~offsym2:
  1018.     movea.l    (sp)+,a1        ;元のOFFSYMTMP(a6)
  1019.     tst.b    (sp)+
  1020.     bgt    offsymtailchk2        ;.offsymの終了処理
  1021.     rts
  1022.  
  1023. ;offsymが正常に終了しているかどうか確認する
  1024. ;a1を破壊する
  1025. offsymtailchk::
  1026.     tst.b    (OFFSYMMOD,a6)
  1027.     ble    offsymtailchk9        ;offsymでないか,シンボルがない
  1028. offsymtailchk1:
  1029.     movea.l    (OFFSYMTMP,a6),a1
  1030. ;a1=セクション変更前の仮のシンボル
  1031. offsymtailchk2:
  1032.     cmpi.b    #SA_NODET,(SYM_ATTRIB,a1)
  1033.     beq    offsymtailchk01        ;値が定まっていなければエラー
  1034. ;仮シンボルはST_LOCALなのでobjgen.sでエラーメッセージが出ることはない
  1035. offsymtailchk9:
  1036.     rts
  1037.  
  1038. offsymtailchk01:
  1039.     move.l    (OFFSYMSYM,a6),(ERRMESSYM,a6)
  1040.     bra    undefsymerr
  1041.  
  1042. ;---------------------------------------------------------------
  1043. ;    .offset    <式>
  1044. ~~offset::
  1045.     move.b    (OFFSYMMOD,a6),-(sp)
  1046.     sf.b    (OFFSYMMOD,a6)
  1047.     bsr    calcconst
  1048.     tst.w    (a0)
  1049.     bne    iloprerr_pseudo_tail    ;行が終了していない
  1050.     bsr    ~~offset1
  1051.     tst.b    (sp)+
  1052.     bne    offsymtailchk1
  1053.     rts
  1054.  
  1055. ;d1=式の値
  1056. ~~offset1:
  1057.     moveq.l    #SECT_ABS,d0
  1058.     bsr    chgsection
  1059.     move.l    d1,(LOCATION,a6)
  1060.     move.l    d1,(LTOPLOC,a6)
  1061.     move.w    #T_OFFSET,d0
  1062.     bsr    wrtobjd0w
  1063.     move.l    d1,d0            ;オフセット値
  1064.     bra    wrtd0l
  1065.  
  1066. ;---------------------------------------------------------------
  1067. ;    .if    <式>
  1068. ~~if::
  1069.     bsr    ifcond
  1070.     tst.l    d1
  1071.     seq.b    d0            ;式が非零ならd0.b=0
  1072. ~~if1:
  1073.     addq.w    #1,(IFNEST,a6)
  1074.     tst.b    d0
  1075.     beq    ~~if9            ;d0.b=0なら条件が成立
  1076. ~~if2:
  1077.     bsr    skipfault        ;条件不成立部のソースを読み飛ばす
  1078.     cmp.w    #2,d0
  1079.     bne    ~~if9            ;else/endifの場合
  1080.     bsr    ifcond            ;elseifの場合
  1081.     tst.l    d1
  1082.     seq.b    d0
  1083.     tst.b    d0
  1084.     bne    ~~if2            ;再び不成立になった
  1085. ~~if9:
  1086.     rts
  1087.  
  1088. ;---------------------------------------------------------------
  1089. ;    .iff    <式>
  1090. ~~iff::
  1091.     bsr    ifcond
  1092.     tst.l    d1
  1093.     sne.b    d0            ;式が零ならd0.b=0
  1094.     bra    ~~if1
  1095.  
  1096. ;---------------------------------------------------------------
  1097. ;    .ifdef    <シンボル>
  1098. ~~ifdef::
  1099.     bsr    symdefchk        ;シンボルが登録済ならd0.b=0
  1100.     bra    ~~if1
  1101.  
  1102. ;---------------------------------------------------------------
  1103. ;    .ifndef    <シンボル>
  1104. ~~ifndef::
  1105.     bsr    symdefchk
  1106.     not.b    d0            ;シンボルが未登録ならd0.b=0
  1107.     bra    ~~if1
  1108.  
  1109. ;---------------------------------------------------------------
  1110. ;    シンボルが登録済かどうかを調べる
  1111. symdefchk:
  1112.     bsr    getword
  1113.     tst.w    d2
  1114.     bmi    iloprerr        ;シンボルがない
  1115.     move.b    (a1)+,d0
  1116.     beq    symdefchk2
  1117.     cmp.b    #',',d0
  1118.     beq    iloprerr_pseudo_many    ;引数が多すぎる
  1119.     cmp.b    #' ',d0
  1120.     bhi    iloprerr        ;シンボル以外の文字が繋がっている
  1121. symdefchk1:
  1122.     move.b    (a1)+,d0
  1123.     beq    symdefchk2
  1124.     cmp.b    #' ',d0
  1125.     bls    symdefchk1
  1126.     cmp.b    #',',d0            ;シンボルの後の空白の先の先頭の文字
  1127.     beq    iloprerr_pseudo_many    ;引数が多すぎる
  1128. symdefchk2:
  1129.     subq.l    #1,a1
  1130.     move.l    a1,(LINEPTR,a6)
  1131.     bra    isdefdsym
  1132.  
  1133. ;---------------------------------------------------------------
  1134. ;    .ifの条件不成立部のソースを読み飛ばす
  1135. skipfault:
  1136.     bsr    deflabel        ;行頭にラベルがあったら定義しておく
  1137.     clr.w    (IFSKIPNEST,a6)
  1138.     st.b    (ISIFSKIP,a6)        ;エラーチェック等はしない
  1139. skipfault1:
  1140.     bsr    getline            ;1行読み込み
  1141.     tst.w    d0
  1142.     bmi    skipfault9        ;読み飛ばし中にソースが終了してしまった
  1143.     or.w    #T_LINE,d0        ;1行開始
  1144.     bsr    wrtobjd0w
  1145.     bsr    encodeline        ;ラベルの処理と命令のコード化
  1146.     tst.b    (ISMACRO,a6)
  1147.     bne    skipfault1        ;マクロ命令
  1148.     move.l    (CMDTBLPTR,a6),d0
  1149.     beq    skipfault1        ;命令がない
  1150.     movea.l    d0,a1
  1151.     move.l    (SYM_FUNC,a1),a1
  1152.     lea.l    (~~if,pc),a2
  1153.     cmpa.l    a1,a2
  1154.     beq    skipfif
  1155.     lea.l    (~~iff,pc),a2
  1156.     cmpa.l    a1,a2
  1157.     beq    skipfif
  1158.     lea.l    (~~ifdef,pc),a2
  1159.     cmpa.l    a1,a2
  1160.     beq    skipfif
  1161.     lea.l    (~~ifndef,pc),a2
  1162.     cmpa.l    a1,a2
  1163.     beq    skipfif
  1164.     lea.l    (~~else,pc),a2
  1165.     cmpa.l    a1,a2
  1166.     beq    skipfelse
  1167.     lea.l    (~~elseif,pc),a2
  1168.     cmpa.l    a1,a2
  1169.     beq    skipfelif
  1170.     lea.l    (~~endif,pc),a2
  1171.     cmpa.l    a1,a2
  1172.     beq    skipfendif
  1173.     bra    skipfault1
  1174.  
  1175. skipfault9:
  1176.     st.b    (ISASMEND,a6)        ;処理を強制終了させる
  1177.     clr.w    (IFNEST,a6)
  1178.     sf.b    (ISIFSKIP,a6)
  1179.     bra    misiferr_eof
  1180.  
  1181. skipfif:                ;if/iff/ifdef/ifndef
  1182.     addq.w    #1,(IFSKIPNEST,a6)
  1183.     bra    skipfault1
  1184.  
  1185. skipfelse:                ;else
  1186.     tst.w    (IFSKIPNEST,a6)
  1187.     bne    skipfault1
  1188.     moveq.l    #1,d0
  1189.     bra    skipfend
  1190.  
  1191. skipfelif:                ;elseif
  1192.     tst.w    (IFSKIPNEST,a6)
  1193.     bne    skipfault1
  1194.     moveq.l    #2,d0
  1195.     bra    skipfend
  1196.  
  1197. skipfendif:                ;endif
  1198.     tst.w    (IFSKIPNEST,a6)
  1199.     beq    skipfendif1
  1200.     subq.w    #1,(IFSKIPNEST,a6)
  1201.     bra    skipfault1
  1202.  
  1203. skipfendif1:
  1204.     subq.w    #1,(IFNEST,a6)
  1205.     moveq.l    #0,d0
  1206. skipfend:
  1207.     sf.b    (ISIFSKIP,a6)
  1208.     move.w    #-1,(LABNAMELEN,a6)
  1209.     rts
  1210.  
  1211. ;---------------------------------------------------------------
  1212. ;    .else
  1213. ~~else::
  1214.     tst.w    (IFNEST,a6)
  1215.     beq    misiferr_else
  1216.     bsr    skipfault
  1217.     cmp.w    #2,d0
  1218.     beq    misiferr_else_elseif    ;elseの後にelseifがあった
  1219.     rts
  1220.  
  1221. ;---------------------------------------------------------------
  1222. ;    .elseif    <式>
  1223. ~~elseif::
  1224.     tst.w    (IFNEST,a6)
  1225.     beq    misiferr_elseif
  1226.     bsr    skipfault
  1227.     subq.w    #1,d0
  1228.     beq    ~~else
  1229.     bcc    ~~elseif
  1230.     rts
  1231.  
  1232. ;---------------------------------------------------------------
  1233. ;    .endif
  1234. ~~endif::
  1235.     tst.w    (IFNEST,a6)
  1236.     beq    misiferr_endif
  1237.     subq.w    #1,(IFNEST,a6)
  1238.     rts
  1239.  
  1240. ;---------------------------------------------------------------
  1241. ;    .end    [<ラベル>]
  1242. ~~end::
  1243.     st.b    (ISASMEND,a6)
  1244.     move.b    (a0),d0
  1245.     cmp.b    #'*',d0
  1246.     beq    ~~end9
  1247.     cmp.b    #';',d0
  1248.     beq    ~~end9
  1249.     bsr    encodeopr
  1250.     lea.l    (OPRBUF,a6),a0
  1251.     lea.l    (RPNBUF,a6),a1
  1252.     tst.w    (a0)
  1253.     beq    ~~end9            ;開始アドレス指定がなかった
  1254.     bsr    convrpn
  1255.     tst.w    d0
  1256.     bmi    exprerr            ;式変換に失敗
  1257.     move.w    d1,d2
  1258.     tst.b    (EXPRISSTR,a6)
  1259.     bne    iloprerr        ;式に文字列を含んでいた
  1260.     bsr    calcrpn
  1261.     tst.w    d0
  1262.     beq    iloprerr        ;<式>がアドレスでない
  1263.     tst.w    (a0)
  1264.     bne    iloprerr_pseudo_tail    ;行が終了していない
  1265.     move.w    #T_END,d0
  1266.     bsr    wrtobjd0w
  1267.     moveq.l    #SZ_LONG,d0
  1268.     move.w    d2,d1
  1269.     bra    wrtrpn            ;式の出力
  1270.  
  1271. ~~end9:
  1272.     rts
  1273.  
  1274. ;---------------------------------------------------------------
  1275. ;    .insert    <ファイル名>[,<オフセット>,<サイズ>]
  1276. ~~insert::
  1277.     tst.b    (a0)
  1278.     beq    iloprerr        ;ファイル名の指定がない
  1279.     lea.l    (OPRBUF,a6),a1
  1280. ~~insert1:
  1281.     move.b    (a0)+,d0
  1282.     move.b    d0,(a1)+
  1283.     cmp.b    #',',d0
  1284.     beq    ~~insert2
  1285.     cmp.b    #' ',d0
  1286.     bhi    ~~insert1
  1287. ~~insert2:
  1288.     subq.l    #1,a0
  1289.     clr.b    (-1,a1)
  1290.  
  1291.     clr.w    -(sp)
  1292.     pea.l    (OPRBUF,a6)
  1293.     DOS    _OPEN
  1294.     addq.l    #6,sp
  1295.     move.l    d0,d3            ;d3=ファイルハンドル
  1296.     bmi    nofileerr        ;ファイルが見つからない
  1297.  
  1298.     move.l    d3,-(sp)
  1299.     bsr    encodeopr
  1300.     move.l    (sp)+,d3
  1301.  
  1302.     tst.b    (ISOBJOUT,a6)
  1303.     bne    ~~insert2_1
  1304.     bsr    flushobj        ;オブジェクトバッファをフラッシュする
  1305. ~~insert2_1:
  1306.  
  1307.     moveq.l    #0,d2            ;オフセット
  1308.     moveq.l    #-1,d1            ;サイズ
  1309.  
  1310.     lea.l    (OPRBUF,a6),a0
  1311.     cmpi.w    #','|OT_CHAR,(a0)
  1312.     bne    ~~insert4
  1313. ~~insert_param_loop:
  1314.     bsr    ~~insert_calcopr
  1315.     move.l    d1,d2            ;d2=オフセット
  1316.  
  1317.     moveq.l    #-1,d1            ;サイズ
  1318.  
  1319.     cmpi.w    #','|OT_CHAR,(a0)
  1320.     bne    ~~insert4
  1321.     bsr    ~~insert_calcopr
  1322.                     ;d1=残りのサイズ
  1323. ~~insert4:
  1324.     tst.l    d1
  1325.     beq    ~~insert8
  1326.     movea.l    d1,a1            ;a1=指定されたサイズ
  1327.  
  1328.     clr.w    -(sp)
  1329.     move.l    d2,-(sp)        ;オフセット
  1330.     move.w    d3,-(sp)
  1331.     DOS    _SEEK
  1332.     addq.l    #8,sp
  1333.     tst.l    d0
  1334.     bmi    ~~insert_seek_error    ;指定された位置までシークできない
  1335.  
  1336. ~~insert_read_loop:
  1337.     movea.w    #256,a2            ;今回転送するサイズ
  1338.     cmp.l    a2,d1
  1339.     bcc    ~~insert6
  1340.     move.l    d1,a2            ;d1>=256でなければd1だけ転送する
  1341. ~~insert6:
  1342.     move.l    a2,-(sp)        ;今回のサイズ
  1343.     pea.l    (OBJCONBUF,a6)        ;オブジェクトバッファに直接読み出す
  1344.     move.w    d3,-(sp)
  1345.     DOS    _READ
  1346.     lea.l    (10,sp),sp
  1347.     tst.l    d0
  1348.     bmi    ~~insert_size_error    ;指定されたサイズを読み出せない
  1349.     cmp.l    a2,d0
  1350.     beq    ~~insert7        ;今回のサイズを読み出せた
  1351.     cmpa.w    #-1,a1
  1352.     bne    ~~insert_size_error    ;サイズが指定されたのに,
  1353.                     ;今回のサイズを読み出せなかった.
  1354.                     ;つまり,指定されたサイズを読み出せない
  1355.     movea.l    d0,a2            ;サイズが指定されていないので,
  1356.     move.l    a2,d1            ;今回で終わりにする
  1357. ~~insert7:
  1358.     add.l    d0,(LOCATION,a6)    ;ロケーションカウンタを更新する
  1359.  
  1360.     tst.b    (ISOBJOUT,a6)
  1361.     bne    ~~insert7_1
  1362.     move.w    d0,(OBJCONCTR,a6)    ;オブジェクトのサイズを指定する(0~256)
  1363.     bsr    flushobj        ;オブジェクトを出力する
  1364.     tst.b    (MAKEPRN,a6)
  1365.     beq    ~~insert7_0
  1366.     move.w    #T_PRNADV,d0
  1367.     bsr    wrtobjd0w
  1368. ~~insert7_0:
  1369. ~~insert7_1:
  1370.  
  1371.     sub.l    a2,d1            ;残りのサイズ
  1372.     bne    ~~insert_read_loop
  1373. ~~insert8:
  1374.     cmpi.w    #','|OT_CHAR,(a0)
  1375.     beq    ~~insert_param_loop
  1376.  
  1377. ~~insert_close:
  1378.     move.w    d3,-(sp)
  1379.     DOS    _CLOSE
  1380.     addq.l    #2,sp
  1381.     rts
  1382.  
  1383. ~~insert_calcopr:
  1384.     addq.l    #2,a0
  1385.     lea.l    (RPNBUF,a6),a1
  1386.     bsr    convrpn
  1387.     tst.w    d0
  1388.     bmi    exprerr            ;式変換に失敗
  1389.     bsr    calcrpn
  1390.     tst.w    d0
  1391.     bne    ilvalueerr        ;定数でない
  1392.     rts
  1393.  
  1394. ~~insert_seek_error:
  1395. ~~insert_size_error:
  1396.     bsr    ~~insert_close
  1397.     bra    ilvalueerr
  1398.  
  1399. ;---------------------------------------------------------------
  1400. ;    .include    <ファイル名>
  1401. ~~include::
  1402.     tst.b    (a0)
  1403.     beq    iloprerr        ;ファイル名の指定がない
  1404.     lea.l    (OPRBUF,a6),a1
  1405. ~~include1:
  1406.     move.b    (a0)+,d0
  1407.     move.b    d0,(a1)+
  1408.     cmp.b    #' ',d0
  1409.     bhi    ~~include1
  1410.     clr.b    (-1,a1)
  1411.     lea.l    (OPRBUF,a6),a0
  1412.     bsr    srchincld        ;インクルードファイルを検索
  1413.     tst.w    d0
  1414.     bmi    nofileerr
  1415.     bsr    openincld
  1416.     tst.w    d0
  1417.     bmi    nofileerr
  1418.     move.w    #T_INCLD,d0
  1419.     bsr    wrtobjd0w
  1420.     move.l    a0,d0
  1421.     bra    wrtd0l            ;ファイル名へのポインタ
  1422.  
  1423. ;---------------------------------------------------------------
  1424. ;    .request    <ファイル名>[,<ファイル名>,…]
  1425. ~~request::
  1426.     tst.b    (a0)
  1427.     beq    iloprerr        ;ファイル名の指定がない
  1428. ~~request1:
  1429.     move.l    (TEMPPTR,a6),d0
  1430.     doeven    d0
  1431.     movea.l    (REQFILEND,a6),a1
  1432.     move.l    d0,(a1)
  1433.     move.l    d0,(REQFILEND,a6)
  1434.     movea.l    d0,a1
  1435.     clr.l    (a1)+
  1436.     bsr    getpara
  1437.     move.l    a1,(TEMPPTR,a6)
  1438.     tst.w    d0
  1439.     bne    ~~request1
  1440.     move.l    a0,(LINEPTR,a6)
  1441.     bra    memcheck
  1442.  
  1443. ;---------------------------------------------------------------
  1444. ;    .list
  1445. ~~list::
  1446.     moveq.l    #1,d0
  1447. ~~list1:
  1448.     or.w    #T_LIST,d0
  1449.     bra    wrtobjd0w
  1450.  
  1451. ;---------------------------------------------------------------
  1452. ;    .nlist
  1453. ~~nlist::
  1454.     moveq.l    #2,d0
  1455.     bra    ~~list1
  1456.  
  1457. ;---------------------------------------------------------------
  1458. ;    .sall
  1459. ~~sall::
  1460.     moveq.l    #3,d0
  1461.     bra    ~~list1
  1462.  
  1463. ;---------------------------------------------------------------
  1464. ;    .lall
  1465. ~~lall::
  1466.     moveq.l    #4,d0
  1467.     bra    ~~list1
  1468.  
  1469. ;---------------------------------------------------------------
  1470. ;    .width    <式>
  1471. ~~width::
  1472.     bsr    calcconst        ;<式>の値は80~255
  1473.     cmp.l    #256,d1
  1474.     bcc    ilvalueerr
  1475.     cmp.w    #80,d1
  1476.     bcs    ilvalueerr
  1477.     and.w    #$FFF8,d1
  1478.     move.w    d1,(PRNWIDTH,a6)
  1479.     rts
  1480.  
  1481. ;---------------------------------------------------------------
  1482. ;    .page    [+/<式>]
  1483. ~~page::
  1484.     bsr    encodeopr
  1485.     lea.l    (OPRBUF,a6),a0
  1486.     lea.l    (RPNBUF,a6),a1
  1487.     bsr    convrpn
  1488.     tst.w    d0
  1489.     bmi    ~~page2            ;式変換に失敗
  1490.     tst.b    (EXPRISSTR,a6)
  1491.     bne    iloprerr        ;式に文字列を含んでいた
  1492.     bsr    calcrpn
  1493.     tst.w    d0
  1494.     bne    iloprerr        ;<式>が定数でない
  1495.     tst.l    d1
  1496.     bmi    ~~page1
  1497.     cmp.l    #256,d1
  1498.     bcc    ilvalueerr
  1499.     cmp.w    #10,d1
  1500.     bcs    ilvalueerr
  1501.     move.w    d1,(PRNPAGEL,a6)    ;<式>の値は10~255
  1502.     rts
  1503.  
  1504. ~~page1:
  1505.     move.w    #-1,(PRNPAGEL,a6)
  1506.     rts
  1507.  
  1508. ~~page2:
  1509.     moveq.l    #0,d0
  1510.     movea.l    (LINEPTR,a6),a0
  1511.     cmpi.b    #'+',(a0)
  1512.     bne    ~~page3
  1513.     moveq.l    #1,d0            ;.page +
  1514. ~~page3:
  1515.     or.w    #T_PAGE,d0
  1516.     bra    wrtobjd0w
  1517.  
  1518. ;---------------------------------------------------------------
  1519. ;    .title    <文字列>
  1520. ~~title::
  1521.     movea.l    (TEMPPTR,a6),a1
  1522.     move.l    a1,(PRNTITLE,a6)
  1523. ~~title1:                ;タイトル文字列を得る
  1524.     move.b    (a0)+,(a1)+
  1525.     bne    ~~title1
  1526.     move.l    a1,(TEMPPTR,a6)
  1527.     bra    memcheck
  1528.  
  1529. ;---------------------------------------------------------------
  1530. ;    .subttl    <文字列>
  1531. ~~subttl::
  1532.     movea.l    (TEMPPTR,a6),a1
  1533.     move.w    #T_SUBTTL,d0
  1534.     bsr    wrtobjd0w
  1535.     move.l    a1,d0
  1536.     bsr    wrtd0l
  1537.     bra    ~~title1
  1538.  
  1539. ;---------------------------------------------------------------
  1540. ;    .comment    <文字列>
  1541. ~~comment::
  1542.     bsr    deflabel        ;行頭にラベルがあったら定義しておく
  1543.     move.w    #-1,(LABNAMELEN,a6)
  1544.     lea.l    (OPRBUF,a6),a1
  1545.     tst.b    (a0)
  1546.     beq    ~~comment85        ;文字列がなければ次の一行のみをコメントとする
  1547. ~~comment1:                ;コメント終了文字列を得る
  1548.     move.b    (a0)+,d0
  1549.     cmp.b    #' ',d0
  1550.     bls    ~~comment2
  1551.     move.b    d0,(a1)+
  1552.     bra    ~~comment1
  1553.  
  1554. ~~comment2:
  1555.     clr.b    (a1)
  1556. ~~comment3:
  1557.     bsr    getline            ;1行読み込み
  1558.     tst.w    d0
  1559.     bmi    ~~comment9        ;読み飛ばし中にソースが終了してしまった
  1560.     or.w    #T_LINE,d0        ;1行開始
  1561.     bsr    wrtobjd0w
  1562.     lea.l    (LINEBUF,a6),a0
  1563. ~~comment4:
  1564.     bsr    skipspc
  1565.     tst.b    (a0)
  1566.     beq    ~~comment3
  1567.     lea.l    (OPRBUF,a6),a1
  1568. ~~comment5:
  1569.     move.b    (a1)+,d0
  1570.     beq    ~~comment6
  1571.     cmp.b    (a0)+,d0
  1572.     beq    ~~comment5
  1573.     bra    ~~comment7
  1574.  
  1575. ~~comment6
  1576.     cmpi.b    #' ',(a0)+
  1577.     bls    ~~comment9
  1578. ~~comment7:
  1579.     subq.l    #1,a0
  1580. ~~comment8:
  1581.     cmpi.b    #' ',(a0)+
  1582.     bhi    ~~comment8
  1583.     subq.l    #1,a0
  1584.     bra    ~~comment4
  1585.  
  1586. ~~comment85:                ;1行のみをコメントとする
  1587.     bsr    getline            ;1行読み込み
  1588.     tst.w    d0
  1589.     bmi    ~~comment9        ;読み飛ばし中にソースが終了してしまった
  1590.     or.w    #T_LINE,d0        ;1行開始
  1591.     bsr    wrtobjd0w
  1592. ~~comment9:
  1593.     rts
  1594.  
  1595. ;---------------------------------------------------------------
  1596. ;    .fail    <式>
  1597. ~~fail::
  1598.     bsr    ifcond
  1599.     tst.l    d1
  1600.     bne    forcederr
  1601.     rts
  1602.  
  1603. ;---------------------------------------------------------------
  1604. ;    .cpu    <式>
  1605. ~~cpu::
  1606.     bsr    calcconst
  1607.     pea.l    (pseudo_tail_check,pc)    ;最後に行の終了をチェックする
  1608.                     ;よって以降でa0を破壊してはならない
  1609.     cmp.l    #68000,d1
  1610.     beq    ~~cpu_68000_change
  1611.     cmp.l    #68010,d1
  1612.     beq    ~~cpu_68010_change
  1613.     cmp.l    #68020,d1
  1614.     beq    ~~cpu_68020_change
  1615.     cmp.l    #68030,d1
  1616.     beq    ~~cpu_68030_change
  1617.     cmp.l    #68040,d1
  1618.     beq    ~~cpu_68040_change
  1619.     cmp.l    #68060,d1
  1620.     beq    ~~cpu_68060_change
  1621.     cmp.l    #5200,d1
  1622.     beq    ~~cpu_5200_change
  1623.     cmp.l    #5300,d1
  1624.     beq    ~~cpu_5300_change
  1625.     cmp.l    #5400,d1
  1626.     beq    ~~cpu_5400_change
  1627.     bra    featureerr_cpu        ;他のCPUは未サポート
  1628.  
  1629. ~~cpu_68000_change:
  1630.     bsr    ~~cpu_changesymbol
  1631. ~~cpu_68000::
  1632.     move.l    #68000,-(sp)
  1633.     bsr    ~~cpu_setsymbol
  1634.     addq.l    #4,sp
  1635.     move.w    #C000,(CPUTYPE,a6)
  1636.     bra    ~~cpu_word0
  1637.  
  1638. ~~cpu_68010_change:
  1639.     bsr    ~~cpu_changesymbol
  1640. ~~cpu_68010::
  1641.     move.l    #68010,-(sp)
  1642.     bsr    ~~cpu_setsymbol
  1643.     addq.l    #4,sp
  1644.     move.w    #C010,(CPUTYPE,a6)
  1645. ~~cpu_word0:
  1646. ;F43G対策のシーケンスをカットする
  1647.     bsr    f43gcut
  1648. ;F43G対策を行わない
  1649.     sf.b    (F43GTEST,a6)
  1650. ~~cpu_word:                ;ディスプレースメントはワードのみ
  1651.     sf.b    (EXTSIZEFLG,a6)
  1652.     move.b    #SZ_WORD,(EXTSIZE,a6)
  1653.     move.l    #2,(EXTLEN,a6)
  1654.     rts
  1655.  
  1656. ~~cpu_68020_change:
  1657.     bsr    ~~cpu_changesymbol
  1658. ~~cpu_68020::
  1659.     move.l    #68020,-(sp)
  1660.     bsr    ~~cpu_setsymbol
  1661.     addq.l    #4,sp
  1662.     move.w    #C020|CFPP|CMMU,(CPUTYPE,a6)
  1663.     bra    ~~cpu_long
  1664.  
  1665. ~~cpu_68030_change:
  1666.     bsr    ~~cpu_changesymbol
  1667. ~~cpu_68030::
  1668.     move.l    #68030,-(sp)
  1669.     bsr    ~~cpu_setsymbol
  1670.     addq.l    #4,sp
  1671.     move.w    #C030|CFPP,(CPUTYPE,a6)
  1672.     bra    ~~cpu_long
  1673.  
  1674. ~~cpu_68040_change:
  1675.     bsr    ~~cpu_changesymbol
  1676. ~~cpu_68040::
  1677.     move.l    #68040,-(sp)
  1678.     bsr    ~~cpu_setsymbol
  1679.     addq.l    #4,sp
  1680.     move.w    #C040,(CPUTYPE,a6)
  1681.     bra    ~~cpu_long0
  1682.  
  1683. ~~cpu_68060_change:
  1684.     bsr    ~~cpu_changesymbol
  1685. ~~cpu_68060::
  1686.     move.l    #68060,-(sp)
  1687.     bsr    ~~cpu_setsymbol
  1688.     addq.l    #4,sp
  1689.     move.w    #C060,(CPUTYPE,a6)
  1690. ~~cpu_long0:
  1691.     move.w    #1<<9,(FPCPID,a6)    ;68040のFPU IDは1のみ
  1692. ~~cpu_long:
  1693.     tst.b    (F43GTEST,a6)
  1694.     bne    ~~cpu_f43gset
  1695.     tst.b    (IGNORE_ERRATA,a6)
  1696.     seq.b    (F43GTEST,a6)
  1697. ;IGNORE_ERRATAがONでもレコードは初期化すること
  1698. ;(-k1 -m68060 -k0のとき-k0ではレコードを初期化しないから)
  1699. ;レコードが初期化されていなければ初期化する
  1700.     movem.l    d0/a0,-(sp)
  1701.     lea.l    (F43GREC,a6),a0
  1702.     move.l    a0,(F43GPTR,a6)
  1703.     moveq.l    #5-1,d0
  1704. ~~cpu_f43gloop:
  1705. ;    clr.l    (8,a0)
  1706.     clr.w    (12,a0)
  1707.     lea.l    (-16,a0),a0
  1708.     move.l    a0,(16+4,a0)
  1709.     lea.l    (16*2,a0),a0
  1710.     move.l    a0,(-16,a0)
  1711.     dbra    d0,~~cpu_f43gloop
  1712.     lea.l    (F43GREC,a6),a0
  1713.     move.l    a0,(16*4,a0)
  1714.     lea.l    (F43GREC+16*4,a6),a0
  1715.     move.l    a0,(-16*4+4,a0)
  1716.     movem.l    (sp)+,d0/a0
  1717. ~~cpu_f43gset:
  1718.     bra    ~~cpu_long2
  1719.  
  1720. ~~cpu_5200_change:
  1721.     bsr    ~~cpu_changesymbol
  1722. ~~cpu_5200::
  1723.     move.l    #5200,-(sp)
  1724.     bsr    ~~cpu_setsymbol
  1725.     addq.l    #4,sp
  1726.     move.w    #C520,(CPUTYPE,a6)
  1727.     bra    ~~cpu_long3
  1728.  
  1729. ~~cpu_5300_change:
  1730.     bsr    ~~cpu_changesymbol
  1731. ~~cpu_5300::
  1732.     move.l    #5300,-(sp)
  1733.     bsr    ~~cpu_setsymbol
  1734.     addq.l    #4,sp
  1735.     move.w    #C530,(CPUTYPE,a6)
  1736.     bra    ~~cpu_long3
  1737.  
  1738. ~~cpu_5400_change:
  1739.     bsr    ~~cpu_changesymbol
  1740. ~~cpu_5400::
  1741.     move.l    #5400,-(sp)
  1742.     bsr    ~~cpu_setsymbol
  1743.     addq.l    #4,sp
  1744.     move.w    #C540,(CPUTYPE,a6)
  1745. ~~cpu_long3:
  1746.     bsr    f43gcut            ;F43G対策のシーケンスをカットする
  1747.     sf.b    (F43GTEST,a6)        ;F43G対策を行わない
  1748. ~~cpu_long2:
  1749.     tst.b    (EXTSHORT,a6)
  1750.     beq    ~~cpu_word        ;外部参照デフォルトはワード
  1751.     st.b    (EXTSIZEFLG,a6)
  1752.     move.b    #SZ_LONG,(EXTSIZE,a6)    ;ディスプレースメントをロングワードにする
  1753.     move.l    #4,(EXTLEN,a6)
  1754.     rts
  1755.  
  1756. ;---------------------------------------------------------------
  1757. ;<d1.l:CPU
  1758. ~~cpu_changesymbol:
  1759.     tst.l    (CPUSYMBOL,a6)
  1760.     beq    ~~cpu_changesymbol9
  1761.     move.l    d0,-(sp)
  1762.     move.w    #T_EQUCONST,d0
  1763.     bsr    wrtobjd0w
  1764.     move.l    (CPUSYMBOL,a6),d0
  1765.     bsr    wrtd0l
  1766.     move.l    d1,d0
  1767.     bsr    wrtd0l
  1768.     move.l    (sp)+,d0
  1769. ~~cpu_changesymbol9:
  1770.     rts
  1771.  
  1772. ;---------------------------------------------------------------
  1773. ;<4(sp).l:CPU
  1774. ~~cpu_setsymbol:
  1775.     tst.l    (CPUSYMBOL,a6)
  1776.     beq    ~~cpu_setsymbol9
  1777.     move.l    a1,-(sp)
  1778.     movea.l    (CPUSYMBOL,a6),a1
  1779.     move.l    (4+4,sp),(SYM_VALUE,a1)
  1780.     movea.l    (sp)+,a1
  1781. ~~cpu_setsymbol9:
  1782.     rts
  1783.  
  1784. ;---------------------------------------------------------------
  1785. ;    .org    <式>
  1786. ~~org::
  1787.     bsr    calcconst
  1788.     move.l    d1,(LOCATION,a6)    ;ロケーションカウンタを変更
  1789.     addq.b    #1,(ORGNUM,a6)
  1790.     move.w    #T_ORG,d0
  1791.     bsr    wrtobjd0w
  1792.     move.l    d1,d0
  1793.     bra    wrtd0l            ;カウンタ値
  1794.  
  1795.  
  1796. ;---------------------------------------------------------------
  1797. ;    SCD対応疑似命令のアセンブル処理
  1798. ;---------------------------------------------------------------
  1799.  
  1800. ;---------------------------------------------------------------
  1801. ;    アセンブラシンボリックデバッグ用にファイル名の出力準備をする
  1802. setsymdebfile::
  1803.     tst.b    (MAKESYMDEB,a6)
  1804.     beq    checksymdeb9        ;'-g'スイッチは指定されていない
  1805.     movea.l    (TEMPPTR,a6),a1
  1806.     movea.l    (SOURCEFILE,a6),a2    ;ソースファイル名へのポインタ
  1807.     move.l    a2,(SCDFILE,a6)
  1808.     bra    ~~file3
  1809.  
  1810. ;---------------------------------------------------------------
  1811. ;    テンポラリにシンボリックデバッグコードを出力するかチェックする
  1812. checksymdeb:
  1813.     tst.b    (MAKESCD,a6)
  1814.     beq    checksymdeb8        ;SCDフラグが立っていない
  1815. checksymdeb1:
  1816.     tst.b    (MAKESYMDEB,a6)
  1817.     beq    checksymdeb9
  1818. checksymdeb8:
  1819.     addq.l    #4,sp            ;'-g'スイッチがあるので,SCD疑似命令は無視する
  1820. checksymdeb9:
  1821.     rts
  1822.  
  1823. ;---------------------------------------------------------------
  1824. ;    .file    "<ファイル名>"
  1825. ~~file::
  1826.     bsr    checksymdeb1        ;'-g'スイッチのチェック
  1827.     cmpi.b    #'"',(a0)+
  1828.     bne    iloprerr
  1829.     movea.l    (TEMPPTR,a6),a1
  1830.     movea.l    a1,a2            ;ファイル名をバッファに保存する
  1831.     moveq.l    #0,d1            ;ファイル長
  1832. ~~file1:
  1833.     move.b    (a0)+,d0
  1834.     cmp.b    #'"',d0
  1835.     beq    ~~file2
  1836.     cmp.b    #' ',d0
  1837.     bls    iloprerr
  1838.     move.b    d0,(a1)+
  1839.     addq.w    #1,d1
  1840.     bra    ~~file1
  1841.  
  1842. ~~file2:
  1843.     clr.b    (a1)+
  1844.     move.l    a1,(TEMPPTR,a6)
  1845.     st.b    (MAKESCD,a6)        ;SCDフラグを立てる
  1846.     move.l    a2,(SCDFILE,a6)        ;ファイル名へのポインタ
  1847.     clr.l    (SCDFILENUM,a6)        ;シンボル延長テーブルは使用しない
  1848.     cmpi.w    #14,d1
  1849.     bls    memcheck
  1850. ~~file3:                ;ファイル名が14文字以上の場合
  1851.     movea.l    a2,a0
  1852.     move.l    a1,d0
  1853.     doeven    d0
  1854.     movea.l    d0,a4
  1855.     move.l    (EXNAMEPTR,a6),d0
  1856.     bne    ~~file5
  1857.     move.l    a4,(EXNAMEPTR,a6)    ;最初の延長シンボルの場合
  1858.     lea.l    (10,a4),a2
  1859.     move.l    a2,(a4)+        ;チェインをつなぐ
  1860.     clr.l    (a4)+            ;先頭からのオフセット
  1861.     clr.w    (a4)+            ;文字列本体(ヌルストリング)
  1862.     clr.l    (a4)+            ;次の延長シンボルへのポインタ
  1863.     moveq.l    #2,d1
  1864.     move.l    d1,(a4)+        ;オフセット(=2)
  1865.     move.l    d1,(SCDFILENUM,a6)    ;(オフセット0は延長テーブルを使用しないという
  1866.     bra    ~~def35            ;意味なので,ダミーのテーブルを作成する)
  1867.  
  1868. ~~file5:
  1869.     movea.l    d0,a3
  1870.     move.l    (a3),d0
  1871.     bne    ~~file3            ;シンボル名チェインの末尾を探す
  1872.     move.l    a4,(a3)            ;チェインをつなぐ
  1873.     clr.l    (a4)+            ;次の延長シンボルへのポインタ
  1874.     move.l    (EXNAMELEN,a6),d1
  1875.     move.l    d1,(a4)+        ;延長テーブル先頭からのオフセット
  1876.     move.l    d1,(SCDFILENUM,a6)
  1877.     bra    ~~def35            ;文字列本体をバッファに格納する
  1878.  
  1879. ;---------------------------------------------------------------
  1880. ;    .ln    <行番号>[,<ロケーション値>]
  1881. ~~ln::
  1882.     bsr    checksymdeb        ;'-g'スイッチのチェック
  1883.     bsr    calcconst
  1884.     move.w    d1,d3
  1885.     cmp.l    #$10000,d1
  1886.     bcc    ilvalueerr        ;行番号は16bit
  1887.     lea.l    (RPNBUF,a6),a1
  1888.     move.w    (a0)+,d0
  1889.     beq    ~~ln2            ;ロケーション値が省略された
  1890.     cmp.w    #',',d0
  1891.     bne    iloprerr
  1892.     bsr    convrpn            ;ロケーション値の指定があった場合
  1893.     tst.w    d0
  1894.     bmi    exprerr            ;式が変換できない
  1895.     tst.b    (EXPRISSTR,a6)
  1896.     bne    iloprerr        ;式に文字列を含んでいた
  1897. ~~ln1:
  1898.     addq.l    #1,(NUMOFLN,a6)
  1899.     move.w    #T_LN,d0
  1900.     bsr    wrtobjd0w
  1901.     move.w    d3,(SCDLN,a6)
  1902.     move.w    d3,d0
  1903.     bsr    wrtd0w
  1904.     moveq.l    #2,d0
  1905.     bra    wrtrpn            ;式の出力
  1906.  
  1907. ~~ln2:
  1908.     move.w    #RPN_LOCATION,(a1)    ;現在のロケーションカウンタ値
  1909.     moveq.l    #1,d1
  1910.     bra    ~~ln1
  1911.  
  1912. ;---------------------------------------------------------------
  1913. ;    .def    <シンボル名>
  1914. ~~def::
  1915.     bsr    checksymdeb        ;'-g'スイッチのチェック
  1916.     cmpi.b    #' ',(a0)
  1917.     bls    iloprerr        ;オペランドがない
  1918.     lea.l    (SCDTEMP,a6),a1
  1919.     moveq.l    #9-1,d0
  1920. ~~def1:
  1921.     clr.l    (a1)+            ;拡張シンボル一時バッファをクリア
  1922.     dbra    d0,~~def1
  1923.     move.w    (SCDLN,a6),(SCD_SIZE+SCDTEMP,a6)    ;????
  1924.     clr.w    (SCDLN,a6)
  1925.     movea.l    a0,a2
  1926.     lea.l    (SCD_NAME+SCDTEMP,a6),a1
  1927.     movea.l    a1,a3
  1928.     moveq.l    #8,d1
  1929. ~~def2:
  1930.     move.b    (a2)+,d0
  1931.     cmp.b    #' ',d0
  1932.     bls    ~~def4
  1933.     move.b    d0,(a3)+
  1934.     dbra    d1,~~def2
  1935.     clr.b    -(a3)            ;シンボル名が8文字以上の場合
  1936.     clr.l    (a1)+
  1937.     lea.l    (EXNAMEPTR,a6),a3
  1938. ~~def31:                ;シンボル名チェインを1つたどる
  1939.     move.l    (a3),d0
  1940.     beq    ~~def34
  1941.     movea.l    d0,a3
  1942.     lea.l    (8,a3),a4
  1943.     movea.l    a0,a2
  1944. ~~def32:                ;すでに同名のシンボルがあるかどうかを調べる
  1945.     move.b    (a2)+,d0
  1946.     cmp.b    #' ',d0
  1947.     bls    ~~def33
  1948.     cmp.b    (a4)+,d0
  1949.     beq    ~~def32
  1950.     bra    ~~def31
  1951.  
  1952. ~~def33:
  1953.     tst.b    (a4)
  1954.     bne    ~~def31
  1955.     move.l    (4,a3),(a1)        ;同名のシンボルが存在した
  1956.     rts
  1957.  
  1958. ~~def34:                ;同名のシンボルがないので新たに登録する
  1959.     move.l    (TEMPPTR,a6),d0
  1960.     addq.l    #1,d0
  1961.     bclr.l    #0,d0
  1962.     movea.l    d0,a4
  1963.     move.l    a4,(a3)            ;チェインをつなぐ
  1964.     clr.l    (a4)+            ;次の延長シンボルへのポインタ
  1965.     move.l    (EXNAMELEN,a6),d1
  1966.     move.l    d1,(a4)+        ;延長テーブル先頭からのオフセット
  1967.     move.l    d1,(a1)
  1968. ~~def35:                ;文字列本体を格納する
  1969.     move.b    (a0)+,d0
  1970.     move.b    d0,(a4)+
  1971.     addq.l    #1,d1
  1972.     cmp.b    #' ',d0
  1973.     bhi    ~~def35
  1974.     clr.b    (-1,a4)
  1975.     move.l    a4,(TEMPPTR,a6)
  1976.     addq.l    #1,d1
  1977.     bclr.l    #0,d1
  1978.     move.l    d1,(EXNAMELEN,a6)
  1979.     bra    memcheck
  1980.  
  1981. ~~def4:                    ;特殊シンボルかどうかをチェック
  1982.     lea.l    (scdsp_name,pc),a1
  1983. ~~def5:
  1984.     lea.l    (SCD_NAME+SCDTEMP,a6),a0
  1985. ~~def6:
  1986.     move.b    (a1)+,d0
  1987.     cmp.b    (a0)+,d0
  1988.     bne    ~~def8
  1989.     tst.b    d0
  1990.     bne    ~~def6
  1991.     move.b    (a1),(SCDATTRIB,a6)    ;特殊シンボルコード
  1992.     move.b    #1,(SCD_LEN+SCDTEMP,a6)    ;テーブルはロングデータ
  1993.     rts
  1994.  
  1995. ~~def7:
  1996.     addq.l    #1,a1
  1997. ~~def8:
  1998.     tst.b    (-1,a1)
  1999.     bne    ~~def7
  2000.     addq.l    #1,a1
  2001.     tst.b    (a1)
  2002.     bne    ~~def5
  2003.     rts                ;特殊シンボルでない
  2004.  
  2005. ;---------------------------------------------------------------
  2006. ;    .endef
  2007. ~~endef::
  2008.     bsr    checksymdeb        ;'-g'スイッチのチェック
  2009.     move.b    (SCDATTRIB,a6),d2
  2010.     move.b    d2,d0
  2011.     andi.b    #$0F,d0
  2012.     bne    ~~endef1
  2013.     move.w    (SCD_TYPE+SCDTEMP,a6),d1
  2014.     andi.w    #$0030,d1
  2015.     cmpi.w    #$0020,d1        ;関数
  2016.     beq    ~~endef04
  2017.     move.b    (SCD_SCL+SCDTEMP,a6),d1
  2018.     moveq.l    #$11,d2            ;タグ定義開始
  2019.     cmpi.b    #10,d1            ;structタグ
  2020.     beq    ~~endef05
  2021.     cmpi.b    #12,d1            ;unionタグ
  2022.     beq    ~~endef05
  2023.     cmpi.b    #15,d1            ;enumタグ
  2024.     beq    ~~endef05
  2025.     moveq.l    #$50,d2
  2026.     cmpi.b    #2,d1            ;extern変数
  2027.     beq    ~~endef1
  2028.     cmpi.b    #80,d1            ;extern変数(SXhas remote)
  2029.     beq    ~~endef1
  2030.     cmpi.b    #82,d1            ;extern変数(SXhas relocate)
  2031.     beq    ~~endef1
  2032.     move.b    (SCDATTRIB,a6),d2    ;static変数/その他
  2033.     bne    ~~endef1
  2034.     moveq.l    #$30,d2
  2035.     bra    ~~endef1
  2036.  
  2037. ~~endef04:
  2038.     moveq.l    #$21,d2            ;関数定義開始
  2039.     addq.l    #1,(NUMOFLN,a6)
  2040. ~~endef05:
  2041.     move.b    #1,(SCD_LEN+SCDTEMP,a6)    ;テーブルはロングデータ
  2042.     move.w    (SCDATTRIB,a6),d0
  2043.     move.b    d2,d0
  2044.     ror.w    #8,d0
  2045.     move.w    d0,(SCDATTRIB,a6)
  2046. ~~endef1:
  2047.     cmp.b    #$2F,d2
  2048.     beq    ~~endef5        ;.scl -1 の場合データ出力はしない
  2049.     moveq.l    #T_ENDEFS>>8,d0
  2050.     moveq.l    #0,d3
  2051.     move.b    (SCD_LEN+SCDTEMP,a6),d3
  2052.     add.w    d3,d0
  2053.     lsl.w    #8,d0            ;オブジェクトコードT_ENDEFS/T_ENDEFL
  2054.     addq.l    #1,d3            ;使用するテーブル長
  2055.     move.b    d2,d0            ;データ型
  2056.     bsr    wrtobjd0w
  2057.     lea.l    (SCD_NAME+SCDTEMP,a6),a0
  2058.     moveq.l    #4-1,d1
  2059. ~~endef2:
  2060.     move.w    (a0)+,d0
  2061.     bsr    wrtd0w            ;シンボル名を出力
  2062.     dbra    d1,~~endef2
  2063.     addq.l    #6,a0
  2064.     move.w    (a0)+,d0
  2065.     bsr    wrtd0w            ;.type
  2066.     move.w    (a0)+,d0
  2067.     bsr    wrtd0w            ;.scl
  2068.     tst.b    d0
  2069.     beq    ~~endef4
  2070.     addq.l    #4,a0
  2071.     moveq.l    #6-1,d1
  2072. ~~endef3:
  2073.     move.w    (a0)+,d0
  2074.     bsr    wrtd0w            ;ロングデータの場合.size/.line/.dimを出力
  2075.     dbra    d1,~~endef3
  2076. ~~endef4:
  2077.     and.w    #$00F0,d2
  2078.     lsr.w    #2,d2
  2079.     lea.l    (NUMOFSCD,a6),a0
  2080.     add.l    d3,(a0)            ;使用したテーブル長だけカウンタを進める
  2081.     add.l    d3,(a0,d2.w)
  2082. ~~endef5:
  2083.     move.w    (SCDATTRIB,a6),d0
  2084.     move.w    #$F0FF,d1
  2085.     and.w    d0,d1
  2086.     andi.w    #$0F00,d0
  2087.     cmpi.w    #$0F00,d0
  2088.     bne    ~~endef6
  2089.     lsl.w    #8,d1            ;タグ/関数定義の終了
  2090. ~~endef6:
  2091.     move.w    d1,(SCDATTRIB,a6)
  2092.     rts
  2093.  
  2094. ;---------------------------------------------------------------
  2095. ;    .val    <式>
  2096. ~~val::
  2097.     bsr    checksymdeb        ;'-g'スイッチのチェック
  2098.     cmpi.b    #'.',(a0)
  2099.     bne    ~~val1
  2100.     cmpi.b    #' ',(1,a0)
  2101.     bhi    ~~val1
  2102.     move.b    #'*',(a0)        ;.val .   → .val *
  2103. ~~val1:
  2104.     bsr    encodeopr
  2105.     lea.l    (OPRBUF,a6),a0
  2106.     lea.l    (RPNBUF,a6),a1
  2107.     bsr    convrpn
  2108.     tst.w    d0
  2109.     bmi    exprerr            ;式が変換できない
  2110.     move.w    #T_VAL,d0
  2111.     bsr    wrtobjd0w
  2112.     moveq.l    #2,d0
  2113.     bra    wrtrpn            ;式の出力
  2114.  
  2115. ;---------------------------------------------------------------
  2116. ;    .scl    <式>
  2117. ~~scl::
  2118.     bsr    checksymdeb        ;'-g'スイッチのチェック
  2119.     bsr    calcconst
  2120.     cmp.l    #-1,d1
  2121.     beq    ~~scl9
  2122.     cmp.l    #$100,d1
  2123.     bcc    ilvalueerr
  2124.     move.b    d1,(SCD_SCL+SCDTEMP,a6)
  2125.     rts
  2126.  
  2127. ~~scl9:                    ;.scl -1 (関数定義の終了)
  2128.     move.b    #$2F,(SCDATTRIB,a6)    ;.endefでの出力はしない
  2129.     move.w    #T_SCL,d0
  2130.     bra    wrtobjd0w
  2131.  
  2132. ;---------------------------------------------------------------
  2133. ;    .type    <式>
  2134. ~~type::
  2135.     bsr    checksymdeb        ;'-g'スイッチのチェック
  2136.     bsr    calcconst
  2137.     cmp.l    #$10000,d1
  2138.     bcc    ilvalueerr
  2139.     move.w    d1,(SCD_TYPE+SCDTEMP,a6)
  2140.     and.w    #$0030,d1
  2141.     cmp.w    #$0030,d1        ;配列
  2142.     beq    ~~type8
  2143.     cmp.w    #$0020,d1        ;関数
  2144.     bne    ~~type9
  2145. ~~type8:
  2146.     move.b    #1,(SCD_LEN+SCDTEMP,a6)    ;テーブルはロングデータ
  2147. ~~type9:
  2148.     rts
  2149.  
  2150. ;---------------------------------------------------------------
  2151. ;    .tag    <タグ名>
  2152. ~~tag::
  2153.     bsr    checksymdeb        ;'-g'スイッチのチェック
  2154.     movea.l    (TEMPPTR,a6),a1
  2155.     move.w    #T_TAG,d0
  2156.     bsr    wrtobjd0w
  2157.     move.l    a1,d0            ;タグ名へのポインタ
  2158.     bsr    wrtd0l
  2159.     move.b    #1,(SCD_LEN+SCDTEMP,a6)    ;テーブルはロングデータ
  2160.     bra    ~~title1        ;指定されたタグ名をメモリに格納する
  2161.  
  2162. ;---------------------------------------------------------------
  2163. ;    .line    <式>
  2164. ~~line::
  2165.     bsr    checksymdeb        ;'-g'スイッチのチェック
  2166.     bsr    calcconst
  2167.     move.b    #1,(SCD_LEN+SCDTEMP,a6)    ;テーブルはロングデータ
  2168.     move.w    d1,(SCD_SIZE+SCDTEMP,a6)
  2169.     rts
  2170.  
  2171. ;---------------------------------------------------------------
  2172. ;    .size    <式>
  2173. ~~size::
  2174.     bsr    checksymdeb        ;'-g'スイッチのチェック
  2175.     bsr    calcconst
  2176.     tst.l    d1
  2177.     beq    ~~size9
  2178.     move.b    #1,(SCD_LEN+SCDTEMP,a6)    ;テーブルはロングデータ
  2179.     move.l    d1,(SCD_SIZE+SCDTEMP,a6)
  2180. ~~size9:
  2181.     rts
  2182.  
  2183. ;---------------------------------------------------------------
  2184. ;    .dim    <式1>[,<式2>…]
  2185. ~~dim::
  2186.     bsr    checksymdeb        ;'-g'スイッチのチェック
  2187.     bsr    encodeopr
  2188.     move.b    #1,(SCD_LEN+SCDTEMP,a6)    ;テーブルはロングデータ
  2189.     moveq.l    #4-1,d2
  2190.     lea.l    (OPRBUF,a6),a0
  2191.     lea.l    (SCD_DIM+SCDTEMP,a6),a2
  2192. ~~dim1:
  2193.     lea.l    (RPNBUF,a6),a1
  2194.     bsr    convrpn
  2195.     tst.w    d0
  2196.     bmi    exprerr            ;式が変換できない
  2197.     tst.b    (EXPRISSTR,a6)
  2198.     bne    iloprerr        ;式に文字列を含んでいた
  2199.     bsr    calcrpn
  2200.     tst.w    d0
  2201.     bne    iloprerr        ;式が定数でない
  2202.     move.w    d1,(a2)+
  2203.     cmp.w    #',',(a0)+
  2204.     bne    ~~dim2
  2205.     dbra    d2,~~dim1
  2206. ~~dim2:
  2207.     tst.w    -(a0)
  2208.     bne    iloprerr
  2209.     rts
  2210.  
  2211. ;---------------------------------------------------------------
  2212. ;    SCD用特殊シンボル名
  2213. scdsp_name:    .dc.b    '.eos',0,$1F,'.bb',0,$2B,'.eb',0,$2C,'.bf',0,$2D,'.ef',0,$2E,0
  2214.     .even
  2215.  
  2216.  
  2217. ;---------------------------------------------------------------
  2218.     .end
  2219.  
  2220. ;---------------------------------------------------------------
  2221. ;    $Log: pseudo.s,v $
  2222. ;    Revision 1.21  1999 10/ 8(Fri) 21:00:37 M.Kamada
  2223. ;    +86 ilsymerrを細分化
  2224. ;    +86 '%s に外部参照値は指定できません'
  2225. ;    +86 foo fequ fooのエラーメッセージがおかしい
  2226. ;
  2227. ;    Revision 1.20  1999  6/ 9(Wed) 23:37:40 M.Kamada
  2228. ;    +85 .offsymでシンボル指定があるとき.even/.quad/.alignをエラーにする
  2229. ;    +85 .dsの引数が負数のとき.text/.dataセクションではエラー,その他はワーニング
  2230. ;
  2231. ;    Revision 1.19  1999  3/15(Mon) 18:20:37 M.Kamada
  2232. ;    +83 疑似命令のパラメータが間違っているときに多すぎると表示されることがあった
  2233. ;    +83 .cpuの引数が間違っているとき多すぎるほうのエラーが優先していた
  2234. ;
  2235. ;    Revision 1.18  1999  3/ 3(Wed) 15:04:45 M.Kamada
  2236. ;    +82 エラーメッセージを日本語化
  2237. ;    +82 疑似命令のパラメータが多すぎる場合のエラーチェックを強化
  2238. ;    +82 doeven→doquad
  2239. ;    +82 F43GRECのサイズを14→16バイト
  2240. ;
  2241. ;    Revision 1.17  1999  2/27(Sat) 23:44:21 M.Kamada
  2242. ;    +81 ソースリストのフォーマットを変更(実行ファイルは+80とまったく同じ)
  2243. ;
  2244. ;    Revision 1.16  1999  2/25(Thu) 05:50:36 M.Kamada
  2245. ;    +80 ColdFire対応
  2246. ;    +80 .dcで文字列を連結して記述できる
  2247. ;    +80 .offsym <初期値>,<シンボル>
  2248. ;    +80 setでset以外で定義されたシンボルの上書き禁止
  2249. ;    +80 +79の.DCのサイズの個別指定の修正が不十分だった
  2250. ;
  2251. ;    Revision 1.15  1999  2/11(Thu) 02:50:24 M.Kamada
  2252. ;    +79 .dcの個別のサイズ指定で.w/.l以外を指定したときの挙動がおかしい
  2253. ;
  2254. ;    Revision 1.14  1998 10/10(Sat) 01:50:32 M.Kamada
  2255. ;    +77 -pのとき.INSERTで1度に256バイト以上読み出すと誤動作する
  2256. ;
  2257. ;    Revision 1.13  1998  8/19(Wed) 00:19:52 M.Kamada
  2258. ;    +73 .dcのデータに個別にサイズを指定できる
  2259. ;
  2260. ;    Revision 1.12  1998  7/29(Wed) 02:32:33 M.Kamada
  2261. ;    +70 .INSERTの引数に10進数以外の数値を指定したときの不具合を修正
  2262. ;
  2263. ;    Revision 1.11  1998  7/14(Tue) 00:19:35 M.Kamada
  2264. ;    +68 .insertを追加
  2265. ;
  2266. ;    Revision 1.10  1998  5/14(Thu) 15:59:24 M.Kamada
  2267. ;    +65 .endの右に注釈が書けなかった
  2268. ;
  2269. ;    Revision 1.9  1998  4/13(Mon) 04:47:07 M.Kamada
  2270. ;    +64 エラッタの対策を禁止するスイッチを追加
  2271. ;
  2272. ;    Revision 1.8  1998  3/27(Fri) 06:30:55 M.Kamada
  2273. ;    +60 .OFFSETセクションでDSの引数に行頭のシンボルを使えないバグ
  2274. ;
  2275. ;    Revision 1.7  1997 10/22(Wed) 02:52:55 M.Kamada
  2276. ;    +52 PMOVE.D #imm,CRPが正しくアセンブルできない不具合
  2277. ;
  2278. ;    Revision 1.6  1997 10/12(Sun) 16:47:22 M.Kamada
  2279. ;    +51 .align 1がエラーにならないバグ
  2280. ;    +51 .OFFSETセクションで.ALIGNを使った場合でも最大アライン値が更新されるバグ
  2281. ;
  2282. ;    Revision 1.5  1997  9/15(Mon) 16:36:55 M.Kamada
  2283. ;    +46 ST_VALUE=0,SZ_BYTE=0で最適化
  2284. ;
  2285. ;    Revision 1.4  1997  6/25(Wed) 00:27:23 M.Kamada
  2286. ;    +33 プレデファインシンボルCPUに対応
  2287. ;    +34 プレデファインシンボルに対応
  2288. ;
  2289. ;    Revision 1.3  1996 12/12(Thu) 16:59:39 M.Kamada
  2290. ;    +02 68060対応
  2291. ;        cpuに68060を追加
  2292. ;        68060追加
  2293. ;    +03 dcb/dsなどのオペランドの式に文字列を含んでいてもよいことにした
  2294. ;
  2295. ;    Revision 1.2  1994/03/06  02:54:56  nakamura
  2296. ;    68000,68010モードでの-eスイッチの扱いを少し変更
  2297. ;
  2298. ;    Revision 1.1  1994/02/13  13:33:28  nakamura
  2299. ;    Initial revision
  2300. ;
  2301. ;
  2302.